React Navigation with Link
In the last lesson, React Nested Routes, you built sections with shared layouts. This lesson shows you the Link component, React Router’s way to move between pages with a click and no reload.
🤔 Why not just use an anchor tag?
Here’s the pain. The plain HTML <a> tag does work, but it does the wrong thing for an SPA.
- A normal
<a href="/about">makes the browser ask the server for a whole new page. - The screen goes blank and reloads, which is slow and feels clunky.
- It throws away your app’s current state and starts fresh every time.
- You lose the whole point of a single-page app, which is instant page changes.
So you need a way to change pages that updates the URL and swaps the component, without a reload. That’s exactly what Link is for.
🧩 The Link component
Link looks and feels like a normal link, but it navigates the React Router way. Instead of href, it uses a to prop.
import { Link } from "react-router-dom";
function Navbar() { return ( <nav> <Link to="/">Home</Link> <Link to="/about">About</Link> <Link to="/contact">Contact</Link> </nav> );}Read the difference from a normal link.
- We import
Linkfromreact-router-dom. - Instead of
href,Linkusestofor the path, liketo="/about". - Clicking it changes the URL and shows the matching route, with no page reload.
- To the user it looks exactly like a normal link, it’s just faster.
to instead of href
The one thing to remember: Link uses to, not href. So it’s <Link to="/about">, not <Link href="/about">. Everything else feels like a normal link.
🔍 What Link does differently
It helps to see what Link actually does compared to <a>, so you trust why it’s faster.
- A plain
<a>triggers a full request to the server and a fresh page load. Linkstops that default behavior and tells React Router to handle it in the browser.- React Router updates the URL and swaps to the matching component, keeping the app alive.
- The browser’s back and forward buttons still work, because React Router updates the history.
So Link gives you a real, clickable, shareable link, but it navigates instantly instead of reloading. Best of both.
🖥️ Link with dynamic paths
Link works great with the route parameters you learned. You build the to path with the value you want, like a user’s id.
import { Link } from "react-router-dom";
function UserList({ users }) { return ( <ul> {users.map((user) => ( <li key={user.id}> <Link to={`/users/${user.id}`}>{user.name}</Link> </li> ))} </ul> );}See how the link is built.
- We map over users and make a
Linkfor each one. - The
touses a template string,`/users/${user.id}`, so each link points to that user. - Clicking “Alex” might go to
/users/1, which your:idroute then handles. - So the list of names becomes a list of links straight to each profile page.
So Link and route parameters work as a team: build the path with the id, and the parameter route reads it on the other side.
⚠️ Common Mistakes
The most common mistake is using a plain <a> tag instead of Link for internal pages, causing a full reload.
// ❌ a plain anchor reloads the whole page, losing SPA speed<a href="/about">About</a>
// ✅ Link navigates with no reload<Link to="/about">About</Link>Keep these in mind.
- Don’t use
<a>for pages inside your app. It reloads and kills the SPA feel. UseLink. - Don’t write
hrefon aLink. It usesto. - Do use a normal
<a>for external sites, like linking to another website.Linkis only for routes inside your app.
Anchor for external, Link for internal
Use Link for pages inside your own app. For a link to a different website, like https://google.com, a plain <a href> is correct, because that really is leaving your app.
✅ Best Practices
A few habits for navigation.
- Use
Linkfor every internal page change, so navigation stays instant. - Remember
tofor the path, nothref. - Build dynamic links with template strings, like
to={`/users/${id}`}. - Keep using a plain
<a>only for external links that leave your app.
Links can be styled freely
A Link renders as a normal anchor in the page, so you can style it with CSS just like any link. It only changes how the click is handled, not how it looks.
🧩 What You’ve Learned
- ✅ A plain
<a>reloads the whole page, which throws away the speed of a single-page app - ✅
Linkfrom React Router changes pages with no reload, keeping the app fast - ✅
Linkuses thetoprop for the path, nothref - ✅ It updates the URL and shows the matching route, and the back/forward buttons still work
- ✅ Build dynamic links with template strings, like
to={`/users/${id}`} - ✅ Use
Linkfor internal pages, but a normal<a>for external websites
Check Your Knowledge
Test what you learned. Pick an answer for each question, then click Check.
- 1
Why use Link instead of a plain anchor tag for internal pages?
Why: A plain <a> reloads the whole page from the server. Link changes the URL and swaps the component in the browser with no reload, which is the point of an SPA.
- 2
Which prop does Link use for the path?
Why: Link uses the to prop, like <Link to='/about'>. Writing href on a Link is a common mistake.
- 3
How do you build a Link to a dynamic route like a user profile?
Why: Build the path with the actual value using a template string, so to={`/users/${user.id}`} points to that specific user's page.
- 4
When is a plain anchor tag still the right choice?
Why: Link is for internal routes. For an external site like https://google.com, a normal <a href> is correct, because you really are leaving your app.
🚀 What’s Next?
Now your users can click to move between pages instantly. But there’s a nicer link for navigation menus, one that knows which page is active and can highlight itself. Next you’ll learn NavLink.