Shallow routing allows you to change the URL without running data fetching
methods again, that includes getServerSideProps
and getStaticProps.
You'll receive the updated pathname and the query via the
router object (added by
useRouter or withRouter),
without losing state.
To enable shallow routing, set the shallow option to true. Consider
the following example:
import { useEffect } from "react"
import { useRouter } from "blitz"
// Current URL is '/'
function Page() {
const router = useRouter()
useEffect(() => {
// Always do navigations after the first render
router.push("/?counter=10", undefined, { shallow: true })
}, [])
useEffect(() => {
// The counter changed!
}, [router.query.counter])
}
export default PageThe URL will get updated to /?counter=10 and the page won't get
replaced, only the state of the route is changed.
You can also watch for URL changes via
componentDidUpdate
as shown below:
componentDidUpdate(prevProps) {
const { pathname, query } = this.props.router
// verify props have changed to avoid an infinite loop
if (query.counter !== prevProps.router.query.counter) {
// fetch data based on the new query
}
}Shallow routing only works for same page URL changes. For example,
let's assume we have another page called pages/about.ts, and you run
this:
router.push("/?counter=10", "/about?counter=10", { shallow: true })Since that's a new page, it'll unload the current page, load the new one and wait for data fetching even though we asked to do shallow routing.