React Route Link And Navlink Complete Guide

 Last Update:2025-06-22T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    7 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of React Route, Link, and NavLink

React Router, Link, and NavLink: Detailed Explanation and Important Information

React Router

Key Features:

  • Declarative Routing: You define routes using components and props, making it easy to read and maintain.
  • Nested Routes: Supports nesting routes, allowing you to create a hierarchy of views.
  • Dynamic Segments: Use route parameters to create dynamic routes (e.g., /users/:id).
  • Redirects and Guards: Ability to perform redirects, handle authentication, and protect routes.
  • Memory, Hash & Browser History: Offers different history implementations (memory, hash, and browser history) to suit different use cases.

Link and NavLink Components

React Router provides two essential components, Link and NavLink, which are used to navigate to different routes within your application. They enhance the user experience by enabling client-side navigation without reloading the page.

Link Component:

  • Purpose: The Link component is used to create navigation links that direct the user to different routes in your application. It renders an anchor (<a>) element in the DOM, but it handles clicks in a way that prevents a full page reload.
  • Props:
    • to: Specifies the path to navigate to. This can be a string or an object describing the location.
    • replace: If true, the link will replace the current entry in the history stack instead of adding a new one.
    • target: Specifies the target attribute, similar to the standard anchor tag.
    • innerRef: Allows you to get a reference to the underlying anchor element.
    • component: Allows you to specify a custom component that will be rendered instead of the default anchor element.

Example:

import { Link } from 'react-router-dom';

function Navigation() {
  return (
    <nav>
      <ul>
        <li><Link to="/">Home</Link></li>
        <li><Link to="/about">About</Link></li>
        <li><Link to="/contact">Contact</Link></li>
      </ul>
    </nav>
  );
}

NavLink Component:

  • Purpose: The NavLink component is similar to Link, but it provides an activeClassName prop that can be used to add CSS classes to the link based on whether it is currently active. This is particularly useful for highlighting the current active navigation link.
  • Props:
    • In addition to the Link component's props, NavLink also has:
    • activeClassName: A CSS class that will be added to the link if the active condition is satisfied.
    • activeStyle: A set of CSS styles that will be applied to the link if it is active.
    • isActive: A function that allows you to control whether the link is considered active based on custom logic.

Example:

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement React Route, Link, and NavLink

Step 1: Set Up Your React App

First, make sure you have Node.js and npm installed. Then, create a new React application using Create React App.

npx create-react-app react-router-example
cd react-router-example

Step 2: Install React Router

React Router is not included by default in Create React App, so you need to install it.

npm install react-router-dom

Step 3: Basic Project Structure

Let's create a basic project structure to organize our files.

src/
  components/
    Home.js
    About.js
    Navbar.js
  App.js
  index.js

Step 4: Create Components

Home Component

Create a Home.js file inside the components folder.

// src/components/Home.js
import React from 'react';

const Home = () => {
  return (
    <div>
      <h1>Home Page</h1>
      <p>Welcome to the Home Page!</p>
    </div>
  );
};

export default Home;

About Component

Create an About.js file inside the components folder.

// src/components/About.js
import React from 'react';

const About = () => {
  return (
    <div>
      <h1>About Page</h1>
      <p>This is the About Page.</p>
    </div>
  );
};

export default About;

Navbar Component

Create a Navbar.js file inside the components folder. This component will use Link and NavLink from React Router.

// src/components/Navbar.js
import React from 'react';
import { Link, NavLink } from 'react-router-dom';

const Navbar = () => {
  return (
    <nav>
      <ul>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <NavLink to="/about" activeClassName="active">
            About
          </NavLink>
        </li>
      </ul>
    </nav>
  );
};

export default Navbar;

Step 5: Set Up React Router in App.js

Now, configure React Router in your App.js file to include Route, Switch, and the Navbar component.

// src/App.js
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './components/Home';
import About from './components/About';
import Navbar from './components/Navbar';

function App() {
  return (
    <Router>
      <div className="App">
        <Navbar />
        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="/about" component={About} />
        </Switch>
      </div>
    </Router>
  );
}

export default App;

Step 6: Add Basic Styling (Optional)

You can add some basic styling in your index.css file to highlight the active NavLink.

/* src/index.css */
body {
  font-family: Arial, sans-serif;
}

nav ul {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  background-color: #333;
}

nav ul li {
  margin: 0;
}

nav ul li a {
  display: block;
  padding: 15px 20px;
  color: white;
  text-decoration: none;
}

nav ul li a:hover {
  background-color: #575757;
}

nav ul li .active {
  background-color: #666;
}

Step 7: Run Your Application

Finally, run your application to see the routing in action.

npm start

You should now see a simple application with a navigation bar. When you click on "Home" or "About", the corresponding component will render below the navigation bar.

Summary

Top 10 Interview Questions & Answers on React Route, Link, and NavLink

1. What is React Router, and what does it do?

Answer: React Router is the most popular library for handling routing in React applications. It allows you to create single-page web applications by maintaining a history stack and changing your browser’s URL without causing a full page reload.

2. How do I set up React Router in my project?

Answer: To set up React Router, follow these steps:

  • Install React Router using npm or yarn:
    npm install react-router-dom
    
  • Import BrowserRouter from react-router-dom and wrap your application in it.
  • Use Route components to declare routes. Example:
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li><Link to="/">Home</Link></li>
            <li><Link to="/about">About</Link></li>
            <li><Link to="/users">Users</Link></li>
          </ul>
        </nav>
        <Route path="/" exact component={Home} />
        <Route path="/about" component={About} />
        <Route path="/users" component={Users} />
      </div>
    </Router>
  );
}

function Home() {
  return <h2>Home Page</h2>;
}

function About() {
  return <h2>About Page</h2>;
}

function Users() {
  return <h2>Users Page</h2>;
}

3. What is the difference between <Link> and <NavLink>?

Answer: <Link> and <NavLink> are both used to navigate within your application, but they have key differences:

  • <Link>: This is used to create a hyperlink in React applications. When clicked, it changes the URL but does not add styling or class names based on whether the link is active.

    Example:

    <Link to="/">Home</Link>
    
  • <NavLink>: Similar to <Link>, but <NavLink> adds specific styling (you can define which classes/styles) when the route it points to matches the current URL in the browser.

    Example:

    <NavLink exact to="/" activeClassName="active-link">Home</NavLink>
    

    In the example above, "active-link" will be added as a class when / is the URL.

4. Can I pass parameters to a route using the <Link> component?

Answer: Yes, you can pass parameters via the to prop of the <Link> component using route objects. Here’s how you can do it:

<Link
  to={{
    pathname: '/profile',
    state: { userId: 123, name: 'John Doe' }
  }}
>
  Go to Profile
</Link>

You can then access these passed props inside the component rendered by the /profile route using useLocation() hook from react-router-dom.

5. How do I handle nested routes with React Router?

Answer: Handling nested routes is straightforward. You render multiple nested Route components inside a parent component. Example:

function Users() {
  return (
    <div>
      <h2>Users</h2>
      <Route path={`${match.url}/:userId`} component={User} />
      <Route path={`${match.url}/new`} component={NewUserForm} />
    </div>
  );
}

function User({ match }) {
  const userId = match.params.userId;
  // Fetch user data based on id
  return <h3>User ID: {userId}</h3>;
}

6. What is history object in React Router, and why is it important?

Answer: The history object represents the session history that is stored in the browser. It provides several methods to interact with the browser’s history such as push(), replace(), and goBack(). This object allows you to programmatically redirect users to another URL.

Example:

import { useHistory } from 'react-router-dom';

function MyComponent() {
  let history = useHistory();

  function handleClick() {
    history.push('/home');
  }

  return (
    <button type="button" onClick={handleClick}>
      Go home
    </button>
  );
}

7. How do I protect a route with authentication using React Router?

Answer: Protecting routes involves rendering something only if a certain condition is met, generally checking if the user is authenticated. One way to achieve this is by creating a higher-order component withAuth.

import React from 'react';
import { Route, Redirect } from 'react-router-dom';

const withAuth = Component => {
  const AuthRoute = ({ ...props }) => {
    const isAuthenticated = localStorage.getItem('authToken') !== null;

    // We can use this conditional to protect the route
    return isAuthenticated ? <Component {...props} /> : <Redirect to="/" />;
  };

  return AuthRoute;
};

function Protected() {
  return <h1>Welcome to protected page!</h1>;
}

const ProtectedRoute = withAuth(Protected);

// Later in your Router setup
<Route path="/protected" component={ProtectedRoute} />;

Another approach could be using hooks or context API to manage authentication state more elegantly.

8. How do I pass query strings in React Router?

Answer: You can append query strings to URLs directly.

<Link to="/search?query=react router">Search React Router</Link>

To read query parameters, you will need to parse them. The recommended library for this task is query-string or URLSearchParams.

Example with query-string:

import React from 'react';
import queryString from 'query-string';
import { useLocation } from 'react-router-dom';

function SearchPage() {
  const location = useLocation();
  const queryParams = queryString.parse(location.search);
  // Now you can use queryParams.query

  return <div>Search Results for: {queryParams.query}</div>;
}

9. How can I perform client-side redirection in React Router?

Answer: You can redirect users on specific events using history.push() or useHistory() hook. Example:

import { useHistory } from 'react-router-dom';

function LoginComponent({ loginStatus, ...props }) {
  const history = useHistory();

  React.useEffect(() => {
    if (loginStatus === 'LOGGED_IN') {
      history.push('/home');
    }
  }, [loginStatus]);
  
  // ...
  return <LoginButton/>;
}

You can also use the <Redirect> component to declaratively redirect users. Example:

import { Redirect } from 'react-router-dom';

function LoginComponent({ loginStatus }) {
  return loginStatus === 'LOGGED_IN' ? (<Redirect to="/home"/>) : (<LoginForm/>);
}

10. Are there any best practices when working with React Router?

Answer: Yes, here are a few best practices to keep in mind:

  • Ordering Routes Correctly: Ensure your routes are ordered correctly to avoid rendering unexpected routes.
  • Use of exact Prop: Use the exact prop when necessary to indicate that the route matches exactly to the given path.
  • Code Splitting: Consider implementing code splitting with lazy loading to improve the performance of your application, especially when dealing with large routes.
  • Error Handling: Implement error boundaries around your route components to catch errors gracefully.
  • SEO Considerations: Since SPAs may not provide SEO friendly content dynamically, ensure you are server side rendering or use third-party solutions for better SEO.
  • State Management: Keep your URL state in sync with your overall application state. This can make navigation history management easier and more consistent.
  • Nested Routes: Structure nested routes carefully by using dynamic parameters that make sense in terms of your application's domain and structure.

You May Like This Related .NET Topic

Login to post a comment.