Bird
Raised Fist0
NextJSframework~20 mins

Shallow routing concept in NextJS - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Shallow Routing Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What happens when shallow routing is used in Next.js?
Consider a Next.js page that uses shallow routing to change the URL query without running getServerSideProps again. What is the expected behavior?
NextJS
import { useRouter } from 'next/router';

export default function Page() {
  const router = useRouter();

  function changeQuery() {
    router.push({ pathname: '/page', query: { tab: '2' } }, undefined, { shallow: true });
  }

  return (
    <>
      <p>Current tab: {router.query.tab || '1'}</p>
      <button onClick={changeQuery}>Change Tab</button>
    </>
  );
}
AThe URL does not update, but the component re-renders with new query values.
BThe URL updates but the component does not re-render.
CThe URL updates and the page fully reloads, calling getServerSideProps again.
DThe URL updates and the component re-renders without calling getServerSideProps or getStaticProps again.
Attempts:
2 left
💡 Hint
Shallow routing updates the URL without a full page reload or data fetching methods running again.
📝 Syntax
intermediate
2:00remaining
Which code snippet correctly uses shallow routing in Next.js?
Select the code snippet that correctly performs shallow routing to update the URL query without a full page reload.
Arouter.push('/page?tab=2', undefined, { shallow: true });
Brouter.replace('/page?tab=2', undefined, { shallow: false });
Crouter.push('/page?tab=2', undefined, { shallow: false });
Drouter.replace('/page?tab=2', undefined, { shallow: true });
Attempts:
2 left
💡 Hint
Shallow routing requires the shallow option set to true and usually uses router.push to add a new history entry.
🔧 Debug
advanced
2:30remaining
Why does shallow routing not update the component state as expected?
A developer uses shallow routing to update the URL query, but the component does not reflect the new query value. What is the most likely cause?
NextJS
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';

export default function Page() {
  const router = useRouter();
  const [tab, setTab] = useState(router.query.tab || '1');

  useEffect(() => {
    setTab(router.query.tab || '1');
  }, []);

  function changeTab() {
    router.push({ pathname: '/page', query: { tab: '2' } }, undefined, { shallow: true });
  }

  return (
    <>
      <p>Current tab: {tab}</p>
      <button onClick={changeTab}>Change Tab</button>
    </>
  );
}
AShallow routing does not update the URL query, so tab remains the same.
BThe useEffect has an empty dependency array, so it does not update tab when router.query changes.
CThe router.push call is missing the shallow option, causing a full reload.
DThe initial state uses router.query.tab which is undefined, causing an error.
Attempts:
2 left
💡 Hint
Check how useEffect dependencies affect state updates when router.query changes.
🧠 Conceptual
advanced
2:00remaining
What is a key limitation of shallow routing in Next.js?
Which of the following is a limitation when using shallow routing in Next.js?
AIt does not trigger getServerSideProps or getStaticProps, so data fetching is not re-run automatically.
BIt causes a full page reload, losing client-side state.
CIt cannot update the URL query parameters.
DIt disables client-side navigation and forces server navigation.
Attempts:
2 left
💡 Hint
Think about what shallow routing skips compared to normal routing.
❓ state_output
expert
2:30remaining
What is the value of router.query.tab after shallow routing?
Given the following code, what will be logged to the console after clicking the button?
NextJS
import { useRouter } from 'next/router';
import { useEffect } from 'react';

export default function Page() {
  const router = useRouter();

  useEffect(() => {
    console.log('Tab query:', router.query.tab);
  }, [router.query.tab]);

  function changeTab() {
    router.push({ pathname: '/page', query: { tab: '3' } }, undefined, { shallow: true });
  }

  return <button onClick={changeTab}>Change Tab</button>;
}
A'2'
Bundefined
C'3'
Dnull
Attempts:
2 left
💡 Hint
Shallow routing updates the URL query and router.query state immediately.

Practice

(1/5)
1. What does shallow routing in Next.js primarily do?
easy
A. Reloads the entire page to fetch new data
B. Prevents URL changes when navigating
C. Changes the URL without reloading the page or losing component state
D. Forces a full server-side render on every navigation

Solution

  1. Step 1: Understand shallow routing purpose

    Shallow routing updates the URL but keeps the current page component and state intact without a full reload.
  2. Step 2: Compare options with shallow routing behavior

    Only Changes the URL without reloading the page or losing component state describes changing the URL without reloading or losing state, matching shallow routing.
  3. Final Answer:

    Changes the URL without reloading the page or losing component state -> Option C
  4. Quick Check:

    Shallow routing = URL change without reload [OK]
Hint: Shallow routing changes URL but keeps page state [OK]
Common Mistakes:
  • Thinking shallow routing reloads the page
  • Assuming shallow routing blocks URL changes
  • Confusing shallow routing with full page reload
2. Which is the correct way to enable shallow routing using Next.js router's push method?
easy
A. router.push('/page?tab=1', undefined, { shallow: true })
B. router.push('/page?tab=1', { shallow: true })
C. router.push('/page?tab=1', true)
D. router.push('/page?tab=1', { reload: false })

Solution

  1. Step 1: Recall router.push syntax for shallow routing

    The third argument to router.push is an options object where shallow: true enables shallow routing.
  2. Step 2: Match options with correct syntax

    router.push('/page?tab=1', undefined, { shallow: true }) correctly passes { shallow: true } as the third argument; others are incorrect or incomplete.
  3. Final Answer:

    router.push('/page?tab=1', undefined, { shallow: true }) -> Option A
  4. Quick Check:

    Shallow routing option is third argument object [OK]
Hint: Use third argument { shallow: true } in router.push [OK]
Common Mistakes:
  • Passing shallow option as second argument
  • Using boolean instead of options object
  • Confusing reload option with shallow
3. Given this code snippet in a Next.js page component:
const router = useRouter();

useEffect(() => {
  console.log('Query changed:', router.query.tab);
}, [router.query.tab]);

const changeTab = () => {
  router.push('/dashboard?tab=2', undefined, { shallow: true });
};

changeTab();

What will be logged to the console after changeTab() is called?
medium
A. Query changed: 2
B. Query changed: undefined
C. Nothing is logged because shallow routing blocks query updates
D. An error occurs because shallow routing cannot update query

Solution

  1. Step 1: Understand effect dependency on router.query.tab

    The effect runs when router.query.tab changes, logging its value.
  2. Step 2: Analyze shallow routing effect on query

    Shallow routing updates the URL and query parameters without full reload, so router.query.tab updates to '2'.
  3. Final Answer:

    Query changed: 2 -> Option A
  4. Quick Check:

    Shallow routing updates query and triggers effects [OK]
Hint: Shallow routing updates query, triggers effects [OK]
Common Mistakes:
  • Assuming shallow routing blocks query updates
  • Expecting no console output
  • Thinking shallow routing causes errors
4. Consider this Next.js code snippet:
const router = useRouter();

const handleClick = () => {
  router.push('/profile?section=info', undefined, { shallow: true });
  router.push('/profile?section=details');
};

handleClick();

What is the problem with this code regarding shallow routing?
medium
A. No problem; shallow routing applies to both pushes automatically
B. Shallow routing is ignored because it must be the first push
C. Both pushes cause full reloads because shallow routing is not supported
D. The second push overrides shallow routing, causing a full reload

Solution

  1. Step 1: Examine the two router.push calls

    The first call uses shallow routing, the second does not and triggers a full reload.
  2. Step 2: Understand effect of second push on routing

    The second push overrides the first and causes a full page reload, negating shallow routing.
  3. Final Answer:

    The second push overrides shallow routing, causing a full reload -> Option D
  4. Quick Check:

    Non-shallow push cancels shallow routing [OK]
Hint: Later push without shallow cancels shallow routing [OK]
Common Mistakes:
  • Assuming shallow routing applies to all pushes automatically
  • Thinking shallow routing must be first push only
  • Ignoring that non-shallow push triggers reload
5. You want to implement tab navigation in a Next.js page using shallow routing to update the URL query without losing component state. Which approach correctly achieves this?
hard
A. Use router.replace without shallow option to update URL and reset state
B. Use router.push with { shallow: true } when changing tabs and listen to router.query to update UI
C. Reload the page on every tab click to fetch fresh data
D. Manually manipulate window.location to change URL without Next.js router

Solution

  1. Step 1: Identify shallow routing usage for tab navigation

    Using router.push with { shallow: true } updates URL query without full reload, preserving component state.
  2. Step 2: Confirm UI updates from router.query changes

    Listening to router.query allows UI to react to tab changes smoothly without losing state.
  3. Final Answer:

    Use router.push with { shallow: true } and listen to router.query -> Option B
  4. Quick Check:

    Shallow routing + query listening = smooth tab navigation [OK]
Hint: Use router.push with shallow and watch router.query [OK]
Common Mistakes:
  • Reloading page loses component state
  • Using router.replace without shallow resets state
  • Manipulating window.location breaks SPA behavior
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