Bird
Raised Fist0
NextJSframework~8 mins

Active link detection in NextJS - Performance & Optimization

Choose your learning style10 modes available
Performance: Active link detection
MEDIUM IMPACT
This affects interaction responsiveness and rendering speed when highlighting navigation links based on the current page.
Highlight the active navigation link based on the current URL
NextJS
import Link from 'next/link';
import { usePathname } from 'next/navigation';

export default function Nav() {
  const pathname = usePathname();
  return (
    <nav>
      {['/', '/about', '/contact'].map((path) => {
        const isActive = pathname === path;
        return (
          <Link
            key={path}
            href={path}
            className={isActive ? 'active-link' : ''}
            aria-current={isActive ? 'page' : undefined}
          >
            {path === '/' ? 'Home' : path.slice(1)}
          </Link>
        );
      })}
    </nav>
  );
}

/* CSS */
.active-link {
  color: red;
}
Using CSS classes instead of inline styles reduces style recalculations. Using usePathname hook avoids unnecessary router object overhead. Adding aria-current improves accessibility.
📈 Performance Gainreduces style recalculations and re-renders, improving INP and user experience
Highlight the active navigation link based on the current URL
NextJS
import { useRouter } from 'next/router';

export default function Nav() {
  const router = useRouter();
  return (
    <nav>
      {['/', '/about', '/contact'].map((path) => (
        <a
          key={path}
          href={path}
          style={{ color: router.pathname === path ? 'red' : 'black' }}
        >
          {path === '/' ? 'Home' : path.slice(1)}
        </a>
      ))}
    </nav>
  );
}
Using inline styles and comparing router.pathname on every render causes React to re-render all links and triggers style recalculations frequently.
📉 Performance Costtriggers multiple style recalculations and re-renders on navigation, increasing INP
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Inline style comparison on every renderMultiple style attribute updatesMultiple reflows on navigationHigh paint cost due to style recalculation[X] Bad
CSS class toggling with usePathname hookMinimal DOM updates, class attribute onlySingle reflow per navigationLow paint cost, efficient style recalculation[OK] Good
Rendering Pipeline
Active link detection updates the DOM to reflect the current page state, affecting style calculation and layout if styles change. Efficient detection minimizes reflows and repaints.
→Style Calculation
→Layout
→Paint
⚠️ BottleneckStyle Calculation due to frequent inline style changes or class toggling
Core Web Vital Affected
INP
This affects interaction responsiveness and rendering speed when highlighting navigation links based on the current page.
Optimization Tips
1Use CSS classes instead of inline styles for active link highlighting.
2Use lightweight hooks like usePathname to detect the current route.
3Avoid frequent state updates that cause re-renders on navigation.
Performance Quiz - 3 Questions
Test your performance knowledge
Which approach reduces style recalculations when highlighting an active link in Next.js?
AApplying inline styles directly in the render method
BUsing a global variable to track active link
CUsing CSS classes toggled by a pathname hook
DReloading the page on every link click
DevTools: Performance
How to check: Record a session while navigating links and watch for style recalculation and layout thrashing in the summary. Check the 'Interactions' and 'Rendering' sections.
What to look for: Look for excessive style recalculations or layout shifts when clicking links indicating inefficient active link detection.

Practice

(1/5)
1. What is the main purpose of active link detection in a Next.js navigation menu?
easy
A. To highlight the link of the current page the user is on
B. To preload all pages linked in the menu
C. To disable links that are not active
D. To change the URL path automatically

Solution

  1. Step 1: Understand active link detection

    Active link detection is used to show which page is currently open by highlighting its link in the navigation.
  2. Step 2: Identify the purpose in Next.js navigation

    Highlighting the current page link helps users know where they are in the site.
  3. Final Answer:

    To highlight the link of the current page the user is on -> Option A
  4. Quick Check:

    Active link detection = Highlight current page link [OK]
Hint: Active link detection means showing current page link highlighted [OK]
Common Mistakes:
  • Thinking it disables other links
  • Confusing with preloading pages
  • Assuming it changes the URL automatically
2. Which Next.js hook is used to get the current URL path for active link detection?
easy
A. useRouter()
B. useHref()
C. usePathname()
D. useLocation()

Solution

  1. Step 1: Recall Next.js hooks for routing

    Next.js provides usePathname() to get the current URL path in the app router.
  2. Step 2: Differentiate from other hooks

    useRouter() is more general, but usePathname() specifically returns the current path string.
  3. Final Answer:

    usePathname() -> Option C
  4. Quick Check:

    Current path hook = usePathname() [OK]
Hint: Use usePathname() to get current URL path in Next.js [OK]
Common Mistakes:
  • Using useRouter() instead of usePathname()
  • Confusing with React Router hooks
  • Using non-existent hooks like useHref()
3. Given this Next.js component snippet, what will be the value of isActive if the current path is /about?
const pathname = usePathname();
const isActive = pathname === '/about';
medium
A. false
B. null
C. undefined
D. true

Solution

  1. Step 1: Understand the usePathname() output

    usePathname() returns the current URL path as a string, here '/about'.
  2. Step 2: Evaluate the comparison

    Comparing pathname === '/about' when pathname is '/about' results in true.
  3. Final Answer:

    true -> Option D
  4. Quick Check:

    Pathname '/about' === '/about' is true [OK]
Hint: Compare pathname string directly to link href for active check [OK]
Common Mistakes:
  • Assuming usePathname() returns an object
  • Using == instead of === causing confusion
  • Expecting false when paths match exactly
4. Identify the error in this Next.js active link detection code:
const pathname = usePathname;
const isActive = pathname === '/home';
medium
A. pathname should be imported from 'next/link'
B. usePathname is not called as a function
C. Comparison operator should be != instead of ===
D. isActive should be a state variable

Solution

  1. Step 1: Check usePathname usage

    usePathname is a hook and must be called as a function: usePathname()
  2. Step 2: Identify the error in assignment

    Assigning usePathname without parentheses assigns the function itself, not the path string.
  3. Final Answer:

    usePathname is not called as a function -> Option B
  4. Quick Check:

    Hooks must be called: usePathname() [OK]
Hint: Always call hooks with () to get their value [OK]
Common Mistakes:
  • Forgetting parentheses on hooks
  • Using wrong comparison operators
  • Importing pathname from wrong module
5. How would you correctly add an aria-current attribute to a Next.js navigation link when it is active using usePathname()? Choose the best code snippet.
hard
A.
const pathname = usePathname();
return <a href='/about' aria-current={pathname === '/about' ? 'page' : undefined}>About</a>;
B.
const pathname = usePathname();
return <a href='/about' aria-current={pathname === '/about' ? true : false}>About</a>;
C.
const pathname = usePathname();
return <a href='/about' aria-current={pathname === '/about' ? 'true' : 'false'}>About</a>;
D.
const pathname = usePathname();
return <a href='/about' aria-current={pathname === '/about' ? 'current' : ''}>About</a>;

Solution

  1. Step 1: Understand aria-current usage

    aria-current should be set to 'page' when the link is active, otherwise omitted or undefined.
  2. Step 2: Check each option's attribute value

    const pathname = usePathname();
    return <a href='/about' aria-current={pathname === '/about' ? 'page' : undefined}>About</a>;
    correctly uses 'page' for active and undefined for inactive, which is the recommended pattern.
  3. Final Answer:

    Option A code snippet -> Option A
  4. Quick Check:

    aria-current='page' when active, undefined otherwise [OK]
Hint: Use aria-current='page' only when link matches current path [OK]
Common Mistakes:
  • Using boolean true/false instead of 'page'
  • Using string 'true' or 'false' incorrectly
  • Setting aria-current to wrong string values
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard