美文网首页
react中没有导航守卫,需要自己封装!

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

作者: 生命里那束光 | 来源:发表于2022-05-24 21:03 被阅读0次

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

1. PC 端项目来说

  • 有的页面不需要登录就可以访问,比如,登录页。
  • 有的页面需要登录后才能访问,比如,项目后台首页、内容管理等(除了登录页面,其他页面需要登录才能访问)

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

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

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

  • 分析:不管哪个页面都是通过路由来访问的,因此,需要从路由角度来进行控制
  • 思路:创建 AuthRoute 组件,判断是否登录,1 登录直接显示要访问的页面 2 没有登录跳转到登录页面

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

一、分析 AuthRoute 鉴权路由组件

  • 场景:限制某个页面只能在登录的情况下访问。
  • 说明:在 React 路由中并没有直接提供该组件,需要手动封装,来实现登录访问控制(类似于 Vue 路由的导航守卫)
  • AuthRoute 组件实际上就是对原来的 Route 组件做了一次包装,代替默认的 Route 组件,来配置路由规则。用法相同,来实现了一些额外的功能。
  • <Route path component render> render 方法,指定该路由要渲染的组件内容(类似于 component 属性)。
// 使用方式:
<AuthRoute path="/rent/add" component={Rent} />

二、实现自己的AuthRoute组件

  • 1.新增hasToken方法
const hasToken = () => !!getToken()

export { setToken, getToken, removeToken, hasToken }
  • 2.权限判断
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

  • 3.使用AuthRoute
{/* 路由规则 */}
<Switch> 
  <AuthRoute path="/home" component={Layout}></AuthRoute>
  <Route path="/login" component={Login}></Route>
  {/* Redirect 组件:重定向组件,通过 to 属性,指定要跳转到的路由信息。 */}
  <Redirect to="/login"></Redirect>
</Switch>
  • 4.登录成功处理
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的path进行匹配,如果路径一直,那么这个对应的组件就会被渲染出来

  • Route没有判断用户是否登录的能力,只会根据path判断是否要渲染对应的组件。

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

相关文章

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

    Recat不同页面访问权限控制 - 鉴权 1. PC 端项目来说 有的页面不需要登录就可以访问,比如,登录页。 有...

  • react-router实现类似vue-router中befor

    react-router中并没有vue-router的路由导航守卫(如beforeEach)等api。 具体原因,...

  • vue-路由导航守卫&异步组件

    导航守卫包括全局导航守卫、路由守卫、组件局部守卫 全局导航守卫 在全局导航守卫中,每次路由的跳转他们三个都会被触发...

  • vue学习笔记(八)导航守卫(全局守卫,路由独享,组件内守卫)

    导航守卫-全局守卫 导航守卫-路由独享 导航守卫-组件内守卫

  • React Native 导航栏

    开始搞一下React Native;刚开始接触 React Native,本着IOS封装的习惯,今天把导航栏封装了...

  • vue导航守卫

    根据作用域的不同,vue导航守卫分三种:全局导航守卫、组件内部导航守卫、路由独享守卫 全局导航守卫,在main.j...

  • vue导航守卫

    导航守卫:vue-router主要提供跳转或取消的方式守卫导航, 导航守卫分为全局前置守卫、全局解析守卫、全局后置...

  • Vue-router之导航守卫

    导航守卫 全局导航守卫 全局钩子 beforeEach 进行数据校验,比如验证页面,用户需要登录后才能显示,设置跳...

  • vue-router进阶

    导航守卫 vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航(路由发生改变才会守卫)。参数 ...

  • vue-router 路由导航守卫

    导航守卫是用取消或者通过的方式来守卫导航,导航守卫有全局的 页面级的组件级的 导航些带的参数发生变化的时候导航守卫...

网友评论

      本文标题:react中没有导航守卫,需要自己封装!

      本文链接:https://www.haomeiwen.com/subject/dhnrprtx.html