Adapters
Using nuqs in your React framework of choice
Since version 2, you can now use nuqs in the following React frameworks, by
wrapping it with a NuqsAdapter
context provider:
- Next.js (app router)
- Next.js (pages router)
- React SPA (eg: with Vite)
- Remix
- React Router v6
- React Router v7
Next.js
App router
Wrap your {children}
with the NuqsAdapter
component in your root layout file:
Pages router
Wrap the <Component>
page outlet with the NuqsAdapter
component in your _app.tsx
file:
Unified (router-agnostic)
If your Next.js app uses both the app and pages routers and the adapter needs to be mounted in either, you can import the unified adapter, at the cost of a slightly larger bundle size (~100B).
The main reason for adapters is to open up nuqs to other React frameworks:
React SPA
Example, with Vite:
Note: because there is no known server in this configuration, the
shallow: false
option will have no effect.
Since nuqs@2.4.0
, you can specify a flag to perform a full-page navigation when
updating query state configured with shallow: false
, to notify the web server
that the URL state has changed, if it needs it for server-side rendering other
parts of the application than the static React bundle:
This may be useful for servers not written in JavaScript, like Django (Python), Rails (Ruby), Laravel (PHP), Phoenix (Elixir) etc…
Remix
React Router v6
Only BrowserRouter
is supported. There may be support for HashRouter
in the future (see issue #810), but
support for MemoryRouter
is not planned.
React Router v7
Deprecation notice
The generic import nuqs/adapters/react-router
(pointing to v6)
is deprecated and will be removed in nuqs@3.0.0.
Please pin your imports to the specific version,
eg: nuqs/adapters/react-router/v6
or nuqs/adapters/react-router/v7
.
The main difference is where the React Router hooks are imported from:
react-router-dom
for v6, and react-router
for v7.
Testing
Documentation for the NuqsTestingAdapter
is on the testing page.