React router之hooks

  • Post author:
  • Post category:其他




Hooks

React router 为您提供了一些 hook,方便你在组件中随时取用 react-router 的状态和进行导航操作

注意:你必须使用 react@16.8+ 才能使用这些 hooks!

且下面是在函数式组件中使用的方法,类式组件对应的是:

this.props.history

this.props.location

this.props.match.params

  • 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 变化后会替换为一个新对象。

mport 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

useLocation 钩子返回一个代表当前 url 的

location

对象。你可以把它想象为一个 useState 钩子,并且在每次 url 变化后会替换为一个新对象。

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 钩子会尝试以与



组件相同的方式去匹配当前 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
})



版权声明:本文为weixin_43604021原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。