- The
<Router hashScrollBehavior>
prop and the<HashScroll>
component now accept a value of "none" to completely scrolling completely, or a function that can be used to implement custom scrolling behaviors. This will allow you to use Navi with react-native apps.
<Router hashScrollBehavior="none">
...
</Router>
-
The
<Link>
component now accepts astate
prop, allowing you to pass state to your routes from the view. -
The
<Link prefetch>
prop now supports a value ofhover
, which is the new default. When prefetch is set tohover
, the link's content will be prefetched whenever the user's mouse hovers over the link, using anonMouseEnter
handler. This can be disabled by passing aprefetch={false}
prop.
-
Removed warning when patterns contain characters that aren't URL safe. For reason, see here.
-
Remove deprecated
navigation
methods:getSteadyValue()
- usegetRoute()
insteadsteady()
- usegetRoute()
instead
-
Remove deprecated route properties:
meta
content
segments
lastSegment
-
Remove support for
render
props in favor of hooks:- Instead of
<Link render>
, useuseLinkProps()
- Instead of
<View children>
, useuseView()
- Instead of
<CurrentRoute>
, useuseCurrentRoute()
- Instead of
<LoadingRoute>
, useuseLoadingRoute()
- Instead of
<NaviConsumer>
, useuseNavigation()
- Instead of
If you still need any of these render props, you can create your own custom component that accepts a render prop and uses the hook internally.
- Bind
navigate
method of Navigation class, so that it can be destructured from return ofuseNavigation()
- Fix bug where the new
loading
option foruseActive
causedexact
to be false by default.
- Add a
loading
option touseActive
, so that you can easily find whether a given link has been clicked -- even if it is still loading. This makes links to pages with async dependencies feel more responsive.
// Will return `true` even while loading the URL
let active = useActive('/url-with-async-dependencies', {
loading: true
})
- Fix
peerDependencies
- Include react-helmet types, so that react-navi-helmet works out of the box with TypeScript
- Fix a regression where nested
<View />
components with async routes inside of a<Suspense />
were failing to render.
This release exposes four new hooks for your convenience:
-
useViewElement()
returns the element that would have been rendered by<View />
. This makes animated transitions far simpler, as you can keep the element in state and it'll always render the same view as when it was first created. -
useView()
is likeuseViewElement()
, but returns an object with the raw view and head content, and aconnect()
function that you'll need to wrap them with. You can think of it like the render-prop version of<View>
-
useLinkProps(props)
accepts the same props as a<Link>
, and returns an object withhref
,onClick
, and any other props that you'd want to spread onto an<a>
. -
useActive(href)
returnstrue
when the current route matches the specified href. You can use this along withuseLinkProps
to create your own custom styled links.
In fact, the Navi <View>
and <Link>
components now use these hooks internally. You can think of these components as a shortcut for using the above hooks.
-
React 16.8+ is now required, as hooks are now used internally.
-
Instead of automatically integrating with react-helmet, you'll need to wrap your app with a Helmet provider. This change was necessary to allow people to use react-helmet-async, which is required for SSR.
If you want to handle the page
<head>
without Navi, no changes are required.If you want to continue to use Navi's
head
andtitle
options, there's just two steps to upgrade:- Add the
react-navi-helmet
orreact-navi-helmet-async
package - Import the default
<HelmetProvider>
, and wrap your app with it:
import HelmetProvider from 'react-navi-helmet-async' ReactDOM.render( <HelmetProvider> <Router routes={routes}> ... </Router> </HelmetProvider>, document.getElementById('root') )
- Add the
-
Previously deprecated properties and exports have been removed
-
Fix bug where matching was overly aggressive
-
No longer use smooth scroll by default, as it causes errors in some browsers.
To enable smooth scroll, pass
hashScrollBehavior='smooth'
to your<Router>
or<NaviProvider>
component.See #71
-
Fix #90 (all links have a
context="[object Object]"
attribute)
- Upgrade create-react-navi-app template to use react-scripts-mdx, with @mdx-js/mdx 1.
- Fix issue where route state was overriding
route.data
, instead of being placed inroute.state