react-router实现路由拦截,useLocation,useNavigate钩子

路由拦截

react-router中没有直接给出拦截路由的方法,需要手动的去监听路由的变化来拦截路由

路由拦截的要点:

  • 能够识别出目标路由和原始路由(区分跳转前和跳转后)
  • 能够在跳转时(跳转前或者跳转后)执行一些操作,比如阻止路由,或者附带参数等等

 根据上面的要求,可以使用useLocationuseEffect钩子函数快速实现,

useLocation会返回当前路由路径的对象,它包含以下参数

location.hash

        当前 URL 的哈希值。

location.key

        此位置的唯一键。

location.pathname

        当前 URL 的路径。

location.search

        当前 URL 的查询字符串(?后的参数部分)。

location.state

        由 <Link state> 或 navigate 创建的位置的状态值。

 在跳转前后使用useLocation就可以记录跳转前后的URL路径,再通过useEffect钩子监听URL,就能实现路由变化时执行一些操作,这样就达成了路由拦截的两个条件

路由示例

使用react-router提供的useLocation,useNavigate钩子函数,模拟实现路由跳转时重定向(类似未登录,跳转登录界面的效果)

实现思路

使用useLocation获取到指定的目标路由(未登录不能访问),然后重定向到其他页面

import { useEffect } from "react";
import { Link ,Outlet, useLocation,useNavigate} from "react-router-dom"


function App() {
  const location = useLocation();
  const navigate = useNavigate();

  useEffect(()=>{
    console.log(location)
    if(location.pathname == '/my'){// 如果当前页面时个人页
      // 重定向到首页
      console.log('重定向到首页')
      navigate('/');
    }
  },[location.pathname])

  return (
    <>
    <nav>
      <Link to='/'>home </Link>
      <Link to='/about'>about </Link>
      <Link to='/my'>my </Link>
    </nav>
      <Outlet></Outlet>
    </>
  )
}

export default App

这样就成功拦截了这个跳转,并重定向到了首页

React Router 提供了一些钩子函数来拦截路由,这样我们就可以在路由跳转之前或之后进行相关的操作。下面是一个简单的路由拦截示例: ```javascript import React from 'react'; import { BrowserRouter as Router, Route, Link, Redirect } from 'react-router-dom'; const isAuthenticated = true; const PrivateRoute = ({ component: Component, ...rest }) => ( <Route {...rest} render={(props) => ( isAuthenticated === true ? <Component {...props} /> : <Redirect to='/login' /> )} /> ); const LoginPage = () => ( <div> <h1>Login Page</h1> </div> ); const HomePage = () => ( <div> <h1>Home Page</h1> </div> ); const App = () => ( <Router> <div> <ul> <li><Link to='/'>Home</Link></li> <li><Link to='/login'>Login</Link></li> </ul> <hr /> <PrivateRoute exact path='/' component={HomePage} /> <Route path='/login' component={LoginPage} /> </div> </Router> ); export default App; ``` 在上面的代码中,我们定义了一个 `PrivateRoute` 组件来实现路由拦截。如果用户已经认证,则展示 `component` 组件,否则重定向到登录页面。 另外,我们还定义了两个页面组件:`HomePage` 和 `LoginPage`。在 `App` 组件中,我们使用 `PrivateRoute` 组件来保护 `HomePage` 组件,这样只有已经认证的用户才能访问该页面。 如果你想在路由跳转之前进行相关的操作,可以使用 `react-router` 提供的 `Prompt` 组件。下面是一个简单的示例: ```javascript import React, { useState } from 'react'; import { BrowserRouter as Router, Route, Link, Prompt } from 'react-router-dom'; const App = () => { const [isBlocking, setIsBlocking] = useState(false); const handleChange = (event) => { setIsBlocking(event.target.value.length > 0); }; return ( <Router> <div> <ul> <li><Link to='/'>Home</Link></li> <li><Link to='/about'>About</Link></li> </ul> <hr /> <Prompt when={isBlocking} message={location => `Are you sure you want to go to ${location.pathname}?`} /> <Route exact path='/' render={() => ( <div> <h1>Home Page</h1> <input type='text' onChange={handleChange} /> </div> )} /> <Route path='/about' render={() => ( <div> <h1>About Page</h1> </div> )} /> </div> </Router> ); }; export default App; ``` 在上面的代码中,我们使用 `Prompt` 组件来拦截路由,在用户输入内容时,如果尚未保存,就弹出提示框。提示框的内容可以通过 `message` 属性来设置。如果用户选择离开当前页面,则路由会跳转到目标页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值