Drop-in alternative of useRouter().query
that tries it's best to get the query params on the first mount.
Have you ever gotten annoyed by the fact that
useRouter().query
is an empty object on the first mount? Great, then this is a library for you.
Given a page called post/[id].jsx
that is called with /post/myId?key=value
:
You will see something like this when first mounting the page:
useRouter().query // result: {} // π’
With next-router-query
you'll see the difference
--------- Render #1 --------
useRouter().query result: {} // π’
useRouterQuery() result: {id: 'myId', key: 'value'} // π»
Once the first render is done and useRouter().query
returns data, we'll simply return that instead.
- This is an evening hack and is not production ready
- Might cause hydration errors when using SSR
- Relies on
URLSearchParams
- you might need some polyfill - Only works in the browser - server will not show the right result
yarn add next-router-query
# or
npm i next-router-query
import { useRouterQuery } from 'next-router-query';
export function MyPage() {
const routerQuery = useRouterQuery()
// ...
}