react中没有导航守卫,需要自己封装!

2022-05-24  本文已影响0人  生命里那束光

Recat不同页面访问权限控制 - 鉴权

1. PC 端项目来说

因此,就需要对项目进行登录访问控制:

  • 让需要登录才能访问的页面,必须在登录后才能访问。
  • 在没有登录时,直接跳转到登录页面,让用户进行登录。

2. 如何实现登录访问控制呢?

难点:React中没有导航守卫,需要自己封装

一、分析 AuthRoute 鉴权路由组件

// 使用方式:
<AuthRoute path="/rent/add" component={Rent} />

二、实现自己的AuthRoute组件

const hasToken = () => !!getToken()

export { setToken, getToken, removeToken, hasToken }
import React from "react"
import { Route, Redirect } from "react-router-dom"
import { hasToken } from 'utils/storage'
function AuthRouter({ component: Component, ...rest }) {
  return (
    <Route
      {...rest}
      render={(props) => {
        // console.log("props", props)
        if (hasToken()) {
          return <Component {...props}></Component>
        } else {
          return (
            <Redirect
              /* state 属性:表示给路由附加一些额外信息,此处,用于指定登录成功后要进入的页面地址。 */
              to={{ pathname: "/login", state: { from: props.location } }}
            ></Redirect>
          )
        }
      }}
    ></Route>
  )
}

export default AuthRouter

{/* 路由规则 */}
<Switch> 
  <AuthRoute path="/home" component={Layout}></AuthRoute>
  <Route path="/login" component={Login}></Route>
  {/* Redirect 组件:重定向组件,通过 to 属性,指定要跳转到的路由信息。 */}
  <Redirect to="/login"></Redirect>
</Switch>
submit = async (values) => {
  const { mobile, code } = values
  console.log(this.props)
  try {
    const res = await login(mobile, code)
    // 存储token
    // localStorage.setItem('itcast_geek_pc', res.data.token)
    setToken(res.data.token)
    // 跳转到首页
    const { state } = this.props.location
    if (state) {
      this.props.history.push(state.from.pathname)
    } else {
      this.props.history.push('/home')
    }
    message.success('登录成功', 1)
  } catch (err) {
    message.warning(err.response.data.message, 1)
  }
}

三、route组件的作用

<Route path="/home" component={Home}></Route>
<Route path="/login" component={Login}></Route>

需求:让Route组件能够有逻辑,能够判断用户是否登录,,,,需要通过Route组件的render属性

上一篇 下一篇

猜你喜欢

热点阅读