Hooks
React router 为您提供了一些 hook,方便你在组件中随时取用 react-router 的状态和进行导航操作
注意:你必须使用 react@16.8+ 才能使用这些 hooks!
- useHistory
- useLocation
- useParams
- useRouteMatch
useHistory
useHistory 钩子返回 history 对象,你可以在上面进行导航等操作
import { useHistory } from 'react-router-dom'
function HomeButton() {
let history = useHistory()
function handleClick() {
history.push('/home')
}
return (
<button type="button" onClick={handleClick}>
Go home
</button>
)
}
useLocation
useLocation 钩子返回一个代表当前 url 的 location 对象。你可以把它想象为一个 useState 钩子,并且在每次 url 变化后会替换为一个新对象。
在您希望每次加载新页面时都使用 Web 分析工具触发新的“pageView”事件的情况下,这可能非常有用,如以下示例所示:
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router, Switch, useLocation } from 'react-router-dom'
function usePageViews() {
let location = useLocation()
React.useEffect(() => {
ga.send(['pageview', location.pathname])
}, [location])
}
function App() {
usePageViews()
return <Switch>...</Switch>
}
ReactDOM.render(
<Router>
<App />
</Router>,
node
)
useParams
useParams 返回 URL 参数的键/值对的对象。使用它来访问 当前<Route>
对应的 match.params。
import React from 'react'
import ReactDOM from 'react-dom'
import {
BrowserRouter as Router,
Switch,
Route,
useParams
} from 'react-router-dom'
function BlogPost() {
let { slug } = useParams()
return <div>Now showing post {slug}</div>
}
ReactDOM.render(
<Router>
<Switch>
<Route exact path="/">
<HomePage />
</Route>
<Route path="/blog/:slug">
<BlogPost />
</Route>
</Switch>
</Router>,
node
)
useRouteMatch
useRouteMatch 钩子会尝试以与<Route>
组件相同的方式去匹配当前 url。在你希望获得路径匹配数据但不希望使用<Route>
的时候他可能会很有用。
以前你可能需要:
import { Route } from 'react-router-dom'
function BlogPost() {
return (
<Route
path="/blog/:slug"
render={({ match }) => {
// Do whatever you want with the match...
return <div />
}}
/>
)
}
而现在:
import { useRouteMatch } from 'react-router-dom'
function BlogPost() {
let match = useRouteMatch('/blog/:slug')
// Do whatever you want with the match...
return <div />
}
useRouteMatch 钩子接受一个可选参数,该参数与 matchPath 的 props 参数相同。它可以是字符串的路径名(如上面的示例),也可以是带有 <Route>
接受的 match 属性对象,如下所示:
const match = useRouteMatch({
path: '/BLOG/:slug/',
strict: true,
sensitive: true
})