亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

react router4+redux實現路由權限控制的方法

2024-05-06 16:44:02
字體:
來源:轉載
供稿:網友

總體概述

一個完善的路由系統應該是這樣子的,當鏈接到的組件是需要登錄后才能查看,要能夠跳轉到登錄頁,然后登錄成功后又跳回來之前想訪問的頁面。這里主要是用一個權限控制類來定義路由路由信息,同時用redux把登錄成功后要訪問的路由地址給保存起來,登錄成功時看redux里面有沒有存地址,如果沒有存地址就跳轉到默認路由地址。

路由權限控制類

在這個方法里面,通過sessionStorage判斷是否登錄了,如果沒有登錄,就保存一下當前想要跳轉的路由到redux里面。然后跳轉到我們登錄頁。

import React from 'react'import { Route, Redirect } from 'react-router-dom'import { setLoginRedirectUrl } from '../actions/loginAction'class AuthorizedRoute extends React.Component {  render() {    const { component: Component, ...rest } = this.props    const isLogged = sessionStorage.getItem("userName") != null ? true : false;    if(!isLogged) {      setLoginRedirectUrl(this.props.location.pathname);    }    return (        <Route {...rest} render={props => {          return isLogged              ? <Component {...props} />              : <Redirect to="/login" />        }} />    )  }}export default AuthorizedRoute

路由定義信息

路由信息也很簡單。只是對需要登錄后才能查看的路由用AuthorizedRoute定義。

import React from 'react'import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom'import Layout from '../pages/layout/Layout'import Login from '../pages/login/Login'import AuthorizedRoute from './AuthorizedRoute'import NoFound from '../pages/noFound/NoFound'import Home from '../pages/home/Home'import Order from '../pages/Order/Order'import WorkOrder from '../pages/Order/WorkOrder'export const Router = () => (    <BrowserRouter>      <div>        <Switch>          <Route path="/login" component={Login} />          <Redirect from="/" exact to="/login"/>{/*注意redirect轉向的地址要先定義好路由*/}          <AuthorizedRoute path="/layout" component={Layout} />          <Route component={NoFound}/>        </Switch>      </div>    </BrowserRouter>)

登錄頁

就是把存在redux里面的地址給取出來,登錄成功后就跳轉過去,如果沒有就跳轉到默認頁面,我這里是默認跳到主頁。因為用了antd的表單,代碼有點長,只需要看連接redux那兩句和handleSubmit里面的內容。

import React from 'react'import './Login.css'import { login } from '../../mock/mock'import { Form, Icon, Input, Button, Checkbox } from 'antd';import { withRouter } from 'react-router-dom';import { connect } from 'react-redux'const FormItem = Form.Item;class NormalLoginForm extends React.Component {  constructor(props) {    super(props);    this.isLogging = false;  }  handleSubmit = (e) => {    e.preventDefault();    this.props.form.validateFields((err, values) => {      if (!err) {        this.isLogging = true;        login(values).then(() => {          this.isLogging = false;          let toPath = this.props.toPath === '' ? '/layout/home' : this.props.toPath          this.props.history.push(toPath);        })      }    });  }  render() {    const { getFieldDecorator } = this.props.form;    return (        <Form onSubmit={this.handleSubmit.bind(this)} className="login-form">          <FormItem>            {getFieldDecorator('userName', {              rules: [{ required: true, message: 'Please input your username!' }],            })(                <Input prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />} placeholder="Username" />            )}          </FormItem>          <FormItem>            {getFieldDecorator('password', {              rules: [{ required: true, message: 'Please input your Password!' }],            })(                <Input prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />} type="password" placeholder="Password" />            )}          </FormItem>          <FormItem>            {getFieldDecorator('remember', {              valuePropName: 'checked',              initialValue: true,            })(                <Checkbox>Remember me</Checkbox>            )}            <a className="login-form-forgot" href="">Forgot password</a>            <Button type="primary" htmlType="submit" className="login-form-button"                loading={this.isLogging ? true : false}>              {this.isLogging ? 'Loging' : 'Login'}            </Button>            Or <a href="">register now!</a>          </FormItem>        </Form>    );  }}const WrappedNormalLoginForm = Form.create()(NormalLoginForm);const loginState = ({ loginState }) => ({  toPath: loginState.toPath})export default withRouter(connect(    loginState)(WrappedNormalLoginForm))

順便說一下這里redux的使用吧。我暫時只會基本使用方法:定義reducer,定義actions,創建store,然后在需要使用redux的變量時候去connect一下redux,需要dispatch改變變量時,就直接把actions里面的方法引入,直接調用就可以啦。為了讓actions和reducer里面的事件名稱對的上,怕打錯字和便于后面修改吧,我建了個actionsEvent.js來存放事件名稱。
reducer:

import * as ActionEvent from '../constants/actionsEvent'const initialState = {  toPath: ''}const loginRedirectPath = (state = initialState, action) => {  if(action.type === ActionEvent.Login_Redirect_Event) {    return Object.assign({}, state, {      toPath: action.toPath    })  }  return state;}export default loginRedirectPath

actions:

import store from '../store'import * as ActionEvent from '../constants/actionsEvent'export const setLoginRedirectUrl = (toPath) => {  return store.dispatch({         type: ActionEvent.Login_Redirect_Event,        toPath: toPath       })}

創建store

import { createStore, combineReducers } from 'redux'import loginReducer from './reducer/loginReducer'const reducers = combineReducers({  loginState: loginReducer //這里的屬性名loginState對應于connect取出來的屬性名})const store = createStore(reducers)export default store

差點忘記說了,路由控制類AuthorizedRoute參考了https://codepen.io/bradwestfall/project/editor/XWNWge?preview_height=50&open_file=src/app.js 這里的代碼。感覺這份代碼挺不錯的,我一開始不會做就是看懂它才有點思路。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性猛交xxxx久久久| 久久精品视频在线观看| 久久全球大尺度高清视频| 姬川优奈aav一区二区| 欧美午夜电影在线| 亚洲精品女av网站| 亚洲热线99精品视频| 日韩av在线一区| 欧美电影在线观看完整版| 国产日韩欧美在线| 亚洲精品资源美女情侣酒店| 国产欧美日韩精品丝袜高跟鞋| 96国产粉嫩美女| 日韩视频在线免费观看| 久久久久久久久久久免费精品| 亚洲免费伊人电影在线观看av| 欧美视频不卡中文| 亚洲国产日韩欧美在线图片| 成人美女av在线直播| 精品久久久久久久久久久| 人人澡人人澡人人看欧美| 亚洲欧美成人一区二区在线电影| 国产精品免费福利| 亚洲欧美国产制服动漫| 欧洲成人性视频| 91精品综合久久久久久五月天| 一区二区三区视频在线| 国产成人精品日本亚洲专区61| 国产欧美精品一区二区三区-老狼| 亚洲天堂第二页| 久久综合88中文色鬼| 色在人av网站天堂精品| 久久久亚洲国产| 欧美激情视频在线观看| 国产日韩中文在线| 91香蕉国产在线观看| 久久精品国产v日韩v亚洲| 性欧美xxxx视频在线观看| 亚洲国模精品一区| 精品国产1区2区| 中文字幕亚洲无线码在线一区| 亚洲一区美女视频在线观看免费| 97人人爽人人喊人人模波多| 欧美性猛交xxxx乱大交3| 91手机视频在线观看| 久久影视电视剧凤归四时歌| 国产精品99久久久久久久久| 欧美孕妇与黑人孕交| 日韩在线观看免费全| 欧美成人自拍视频| 国产精品偷伦视频免费观看国产| 日韩中文在线中文网在线观看| 伊人伊成久久人综合网站| 神马国产精品影院av| 成人精品一区二区三区电影黑人| 国产成人欧美在线观看| 91久久久久久国产精品| 成人黄色大片在线免费观看| 久久久久久久久久av| 欧美一区亚洲一区| 成人性生交大片免费看视频直播| 久久视频国产精品免费视频在线| 午夜精品视频在线| 国产小视频国产精品| 日韩一区二区三区在线播放| 国产精品入口夜色视频大尺度| 欧美日韩亚洲高清| 久久久久久午夜| 欧美激情在线狂野欧美精品| 日韩一级裸体免费视频| 欧美另类老肥妇| 午夜精品99久久免费| 亚洲精品美女在线| 欧美精品xxx| 久久99亚洲热视| 菠萝蜜影院一区二区免费| 欧美大胆在线视频| 亚洲国产天堂久久国产91| 久久久久久久久久亚洲| 国产91在线播放精品91| 色综合天天狠天天透天天伊人| 亚洲性av在线| 久久精品视频亚洲| 亚洲国产中文字幕久久网| 亚洲free性xxxx护士hd| xxxxxxxxx欧美| 日韩不卡中文字幕| 成人免费xxxxx在线观看| 日韩在线观看免费高清| 亚洲最大福利视频| 国产精品白嫩初高中害羞小美女| 91九色视频导航| 国产精品视频中文字幕91| 亚洲欧美日韩久久久久久| 国产精品久久久av久久久| 国产精品r级在线| 97高清免费视频| 成人在线激情视频| 色综合久久88色综合天天看泰| 国产一区二区三区高清在线观看| 国产精品啪视频| 日韩www在线| 日韩在线观看电影| 51午夜精品视频| 国产亚洲xxx| 欧美亚洲在线观看| 中文字幕精品久久久久| 成人久久18免费网站图片| 日韩在线欧美在线| 久久天天躁狠狠躁老女人| 不卡伊人av在线播放| 亚洲精品视频网上网址在线观看| 久久97精品久久久久久久不卡| 国产精品美女www| 国产精品三级久久久久久电影| 久久伊人精品一区二区三区| 欧美精品videosex极品1| 亚洲国产精品久久精品怡红院| 91伊人影院在线播放| 欧美激情中文字幕在线| 久久伊人精品天天| 久久久精品在线观看| 国产精品久久久久av| 91精品国产色综合| 亚洲精品美女免费| 日韩中文字幕国产| 久久夜色精品亚洲噜噜国产mv| 精品国产一区二区在线| 精品高清一区二区三区| 亚洲在线观看视频网站| 91天堂在线视频| 亚洲综合最新在线| 久久福利网址导航| 欧美人在线视频| 国产69精品久久久久99| 日韩美女免费观看| 国产精品午夜视频| 亚洲久久久久久久久久| 亚洲欧美日韩精品久久奇米色影视| 欧美日产国产成人免费图片| 粉嫩老牛aⅴ一区二区三区| 久久视频在线直播| 亚洲aⅴ日韩av电影在线观看| 日韩毛片中文字幕| 国产视频亚洲精品| 亚洲深夜福利网站| 日本一区二三区好的精华液| 日韩在线激情视频| 欧美综合在线第二页| 色琪琪综合男人的天堂aⅴ视频| 视频在线一区二区| 国内精品美女av在线播放| 国产精品电影久久久久电影网| 久青草国产97香蕉在线视频| 北条麻妃一区二区在线观看| 精品性高朝久久久久久久| 亚洲欧美制服第一页| 久久精品色欧美aⅴ一区二区| 美女视频黄免费的亚洲男人天堂| 国产欧美在线看| 精品动漫一区二区三区| 欧美成人一二三| 欧美日韩福利视频| 91国内免费在线视频|