最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react路由守衛(wèi)的實(shí)現(xiàn)(路由攔截)

 更新時間:2021年08月06日 09:02:02   作者:bright1688  
react不同于vue,通過在路由里設(shè)置meta元字符實(shí)現(xiàn)路由攔截。本文就詳細(xì)的介紹一下,具有一定的參考價值,感興趣的小伙伴們可以參考一下

react不同于vue,通過在路由里設(shè)置meta元字符實(shí)現(xiàn)路由攔截。在使用 Vue ,框架提供了路由守衛(wèi)功能,用來在進(jìn)入某個路有前進(jìn)行一些校驗(yàn)工作,如果校驗(yàn)失敗,就跳轉(zhuǎn)到 404 或者登陸頁面,比如 Vue 中的 beforeEnter 函數(shù):

...
router.beforeEach(async(to, from, next) => {
    const toPath = to.path;
    const fromPath = from.path;
})
...

react實(shí)現(xiàn)路由攔截的基本思路還是利用Route 的render函數(shù)。通過判斷攔截條件來實(shí)現(xiàn)不同的組件的跳轉(zhuǎn),從而實(shí)現(xiàn)攔截。在之前的版本中,React Router 也提供了類似的 onEnter 鉤子,但在 React Router 4.0 版本中,取消了這個方法。React Router 4.0 以后采用了聲明式的組件,路由即組件,要實(shí)現(xiàn)路由守衛(wèi)功能,就得我們自己去寫了。
如果不使用路由守衛(wèi),Router 組件是這樣子的:

import * as React from 'react';
import { HashRouter,Switch,Route,Redirect } from 'react-router-dom';
 
import Index from "./page/index";
import Home from "./page/home";
import ErrorPage from "./page/error";
import Login from "./page/login";
 
export const Router = () => (
    <HashRouter>
        <Switch>
            <Route path="/" exact component={Index}/>
            <Route path="/login" exact component={Login}/>
            <Route path="/home" exact component={Home}/>
            <Route path="/404" exact component={ErrorPage}/>
            <Redirect to="/404" />
        </Switch>
    </HashRouter>
);

上面的 Router 組件,包含了三個頁面:

登陸
主頁
404 頁面
以及四個路由:
根路由
登陸路由
主頁路由
404 路由
其中,根路由和 /home 路由,都定向到了主頁路由。
以上是一個基本的路由定義,可以在登陸/主頁和 404 頁面之間來回跳轉(zhuǎn),但也有一些問題:
非登陸狀態(tài)下,可以直接跳轉(zhuǎn)到主頁
登陸狀態(tài)下,也可以輸入 /login 路由跳轉(zhuǎn)到登錄頁
現(xiàn)在,我們想完成這樣的功能:
非登陸狀態(tài)下,無法直接跳轉(zhuǎn)到主頁,如果在非登陸狀態(tài)下進(jìn)行主頁跳轉(zhuǎn),需要重定向至登陸路由
登陸狀態(tài)下,無法跳轉(zhuǎn)至登錄頁,如果在登陸狀態(tài)下進(jìn)行登陸頁跳轉(zhuǎn),需要重定向至主頁路由
要完成這個功能,有兩種方案:
在每個組件中,根據(jù) props 上的 history 對象來進(jìn)行跳轉(zhuǎn)
進(jìn)行全局的路由守衛(wèi)處理

首先在跟目錄src下創(chuàng)建一個routerMap.js文件,代碼如下:
將 auth 設(shè)置為 true,表示該路由需要權(quán)限校驗(yàn)。

/**
 * 定義路由組件,將 auth 設(shè)置為 true,表示該路由需要權(quán)限校驗(yàn)
 */

import Admin from "./pages/Admin";
import Login from "./pages/Login";
import Error from "./pages/Error";

export const routerMap = [
    {path: "/", name: "admin", component: Admin, auth: true},
    {path: "/login", name: "Login", component: Login},
    {path: "/error", name: "error", component: Error},
];

所有的路由跳轉(zhuǎn),都交給 FrontendAuth 高階組件代理完成。下面是 FrontendAuth.js 組件的實(shí)現(xiàn):

/**
 * 路由守衛(wèi)校驗(yàn)
 */
import React, {Component} from "react";
import {Route, Redirect} from "react-router-dom";

class FrontendAuth extends Component {
    // eslint-disable-next-line no-useless-constructor
    constructor(props) {
        super(props);
    }

    render() {
        const {routerConfig, location} = this.props;
        const {pathname} = location;
        const isLogin = localStorage.getItem("user");
        console.log(pathname, isLogin);
        console.log(location);
        // 如果該路由不用進(jìn)行權(quán)限校驗(yàn),登錄狀態(tài)下登陸頁除外
        // 因?yàn)榈顷懞螅瑹o法跳轉(zhuǎn)到登陸頁
        // 這部分代碼,是為了在非登陸狀態(tài)下,訪問不需要權(quán)限校驗(yàn)的路由
        const targetRouterConfig = routerConfig.find(
            (item) => item.path === pathname
        );
        console.log(targetRouterConfig);
        if (targetRouterConfig && !targetRouterConfig.auth && !isLogin) {
            const {component} = targetRouterConfig;
            return <Route exact path={pathname} component={component}/>;
        }
        if (isLogin) {
            // 如果是登陸狀態(tài),想要跳轉(zhuǎn)到登陸,重定向到主頁
            if (pathname === "/login") {
                return <Redirect to="/"/>;
            } else {
                // 如果路由合法,就跳轉(zhuǎn)到相應(yīng)的路由
                if (targetRouterConfig) {
                    return (
                        <Route path={pathname} component={targetRouterConfig.component}/>
                    );
                } else {
                    // 如果路由不合法,重定向到 404 頁面
                    return <Redirect to="/error"/>;
                }
            }
        } else {
            // 非登陸狀態(tài)下,當(dāng)路由合法時且需要權(quán)限校驗(yàn)時,跳轉(zhuǎn)到登陸頁面,要求登陸
            if (targetRouterConfig && targetRouterConfig.auth) {
                return <Redirect to="/login"/>;
            } else {
                // 非登陸狀態(tài)下,路由不合法時,重定向至 404
                return <Redirect to="/error"/>;
            }
        }
    }
}

export default FrontendAuth;

然后,定義 Router 組件,在App.js中,該組件是經(jīng)過高階組件包裝后的結(jié)果:

import './App.less';
import React, {Fragment} from "react";
import {Switch} from 'react-router-dom'
import FrontendAuth from "./FrontendAuth";
import {routerMap} from "./routerMap";

function App() {
    return (
        <Fragment>
            {/*只匹配一個,匹配成功就不往下匹配,效率高*/}
            <Switch>
                <FrontendAuth routerConfig={routerMap}/>
            </Switch>
        </Fragment>
    );
}

export default App;

測試

到此這篇關(guān)于react路由守衛(wèi)的實(shí)現(xiàn)(路由攔截)的文章就介紹到這了,更多相關(guān)react路由守衛(wèi)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用react-native-doc-viewer實(shí)現(xiàn)文檔預(yù)覽

    使用react-native-doc-viewer實(shí)現(xiàn)文檔預(yù)覽

    這篇文章主要介紹了使用react-native-doc-viewer實(shí)現(xiàn)文檔預(yù)覽,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • React封裝全屏彈框的方法

    React封裝全屏彈框的方法

    這篇文章主要為大家詳細(xì)介紹了React封裝全屏彈框的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • React中的useEffect useLayoutEffect到底怎么用

    React中的useEffect useLayoutEffect到底怎么用

    這篇文章主要介紹了React中的useEffect useLayoutEffect具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • React?redux?原理及使用詳解

    React?redux?原理及使用詳解

    這篇文章主要為大家介紹了React?redux?原理及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • react性能優(yōu)化useMemo與useCallback使用對比詳解

    react性能優(yōu)化useMemo與useCallback使用對比詳解

    這篇文章主要為大家介紹了react性能優(yōu)化useMemo與useCallback使用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • React-Hook中使用useEffect清除定時器的實(shí)現(xiàn)方法

    React-Hook中使用useEffect清除定時器的實(shí)現(xiàn)方法

    這篇文章主要介紹了React-Hook中useEffect詳解(使用useEffect清除定時器),主要介紹了useEffect的功能以及使用方法,還有如何使用他清除定時器,需要的朋友可以參考下
    2022-11-11
  • 詳解如何在React組件“外”使用父組件的Props

    詳解如何在React組件“外”使用父組件的Props

    這篇文章主要介紹了詳解如何在React組件“外”使用父組件的Props,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • React+ResizeObserver實(shí)現(xiàn)自適應(yīng)ECharts圖表

    React+ResizeObserver實(shí)現(xiàn)自適應(yīng)ECharts圖表

    ResizeObserver是JavaScript的一個API,用于監(jiān)測元素的大小變化,本文主要為大家介紹了React如何利用ResizeObserver實(shí)現(xiàn)自適應(yīng)ECharts圖表,需要的可以參考下
    2024-01-01
  • React?Native?中限制導(dǎo)入某些組件和模塊的方法

    React?Native?中限制導(dǎo)入某些組件和模塊的方法

    這篇文章主要介紹了React?Native?中限制導(dǎo)入某些組件和模塊的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 關(guān)于react中的常見錯誤及解決

    關(guān)于react中的常見錯誤及解決

    這篇文章主要介紹了關(guān)于react中的常見錯誤及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論

栖霞市| 抚远县| 沅陵县| 托克逊县| 时尚| 平罗县| 宝山区| 铁岭县| 新乐市| 金秀| 新源县| 大理市| 宝鸡市| 宁强县| 罗源县| 江源县| 六枝特区| 乐安县| 玛曲县| 逊克县| 双峰县| 额济纳旗| 湖南省| 稻城县| 彩票| 印江| 城步| 阿巴嘎旗| 磐石市| 莲花县| 平顶山市| 乡城县| 滨州市| 荥阳市| 衢州市| 会东县| 隆回县| 高唐县| 惠水县| 平阴县| 西青区|