日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

react-router v6實現權限管理+自動替換頁面標題的案例

瀏覽:360日期:2022-06-09 16:11:51
目錄
  • 權限管理
  • 總結

學了一段時間的react+ts,想著寫一個項目練練手,由于初次寫react+ts項目,有很多東西并不知道應該怎么寫,再加上之前寫vue項目的習慣,突然轉換react有點不習慣,有很多在vue中的寫法,并不知道是否在react中仍然可行。寫項目之前先考慮了權限管理,第一次使用react-router v6 也不知道是否有更好的寫法。這次就來簡單分享一下我實現權限管理以及攔截器中遇到的一些問題。

權限管理

這次項目是有三種權限,分別是用戶,商家以及管理員。這次寫的權限管理是高級權限能訪問低級權限的所有頁面,但是低級權限不能訪問高級權限的頁面。
簡單實現

// 在這里進行判斷用戶權限使用不同的頁面
import React from "react";
import Merchant from "../pages/merchant";
import Admin from "../pages/admin";
import User from "../pages/user";
export default function Index() {
//這里使用power來判斷是否登錄,以及權限
  let power = localStorage.getItem("power");
  return (
    <div>
      {power ? (
power === "1" ? (
  <Merchant></Merchant>
) : (
  <Admin></Admin>
)
      ) : (
<User></User>
      )}
    </div>
  );
}

我實現權限管理的方式就是根據不同的權限掛載不同的頁面,在頁面中實現掛載不同的路由。
之后看一下我在三種不同頁面中的路由定義以及具體內容,即不需要顯示的路由就不應該被注冊
user路由表

// 引入路由
import Login from "../pages/user/login";
import Register from "../pages/user/register";
import NoPower from "../pages/error/noPower";
import NoPage from "../pages/error/noPage";
import { myRouteObj } from "../type";
//這里的myRouteObj是我自定義的一個類型用于拓展title實現頁面標題的自動切換
export const userRoutes: myRouteObj[] = [
  {
    path: "/404",
    element: <NoPage></NoPage>,
    title: "404"
  },
  {
    path: "/login",
    element: <Login></Login>,
    title: "登錄"
  },
  {
    path: "/register",
    element: <Register></Register>,
    title: "注冊"
  },
];
const routes = [
  ...userRoutes,
  {
    path: "*",
    element: <NoPower></NoPower>,
    title: "沒有權限"
  },
];
export default routes;

路由表中暴露了兩個對象,分別是最"原始的對象"和使用的對象,這兩個對象的區別就是是否有攔截器,為什么需要把這個給區分開,是因為我們的目的是高權限的用戶能訪問到低權限用戶所能訪問的頁面,又由于我們是通過返回不同的頁面來實現的權限管理(即使用過程中必須高權限的路由中包含低權限的路由)而且攔截器必須要放在最后,所以就分了兩個來暴露,一個是供注冊路由使用(有攔截器版本),另一個是由高級權限路由表合并使用

myRouteObj的內容

import { NonIndexRouteObject } from "react-router";
export interface myRouteObj extends NonIndexRouteObject {
  title?: string;
}

user頁面的入口文件

import React from "react";
import userRoutes from "../../router/user";
import { useMyRoutes } from "../../hooks/route";
export default function User() {
//這里的useMyRoutes是我自己封裝的一個鉤子函數
  const element = useMyRoutes(userRoutes);
  return <div>{element}</div>;
}

useMyRoutes鉤子函數的具體內容
該鉤子函數用于更換頁面標題以及一級路由表中是否有該路由(沒有的話會跳到404),這里為什么只判斷了一級路由表是因為我個人感覺一級路由如果輸入錯誤,其就應該跳轉到404頁面,而二級路由輸入錯誤,應該重定向到二級路由正確的位置,這樣我感覺對用戶要更友好一點,所以我在二級路由中添加了重定向的功能,并且也實現了替換標題的功能,如果沒有標題的話會返回一個默認值

import { useEffect } from "react";
import { useLocation, useNavigate, useRoutes } from "react-router";
import { myRouteObj } from "../type";
function flatDeep(children: any, findArr: any): string {
  // 判斷children數組中是否有想要的元素
  let tempArr = children.map((item: any) => item.path);
  let index = tempArr.indexOf(findArr[0]);
  if (index !== -1) {
    return findArr.length > 1
      ? flatDeep(children[index], findArr.splice(1, findArr.length))
      : children[index].title;
     ? children[index].title
     : "商城";
  }
  return "商城";
}
export function useMyRoutes(routes: myRouteObj[]) {
  // 判斷路由表中是否有對應路由,如果沒有就返回到404
  const location = useLocation();
  const navigate = useNavigate();
  useEffect(() => {
  /*
這里有一個小問題,困擾了我半天,就是原本我獲取路徑是寫在useEffect外邊的,頁面每次刷新就會顯示成錯誤的標題,最后輸出是因為報存的值沒有更新,所以就改到useEffect函數里邊了
*/
    // 非空
    const firstPathName = location.pathname
      .split("/")
      .filter((item) => item !== "");
    const firstPath = routes.map((item) => item.path?.split("/")[1]);
    let index = firstPath.indexOf(firstPathName[0]);
    if (!index) {
      navigate("/404");
      return;
    }
    // 判斷是否是首頁
    if (location.pathname === "/") {
      document.title = "商城";
      return;
    }
    // 判斷是幾級路由
    if (firstPathName.length > 1) {
      // 多級
      document.title = flatDeep(
routes[index].children,
firstPathName.splice(1, firstPathName.length)
      );
      return;
    }
    // 一級
    document.title = routes[index].title
      ? (routes[index].title as string)
      : "商城";
  }, [location, navigate, routes]);
  return useRoutes(routes);
}

商家的路由表

import { Navigate } from "react-router";
import Merchant from "../pages/merchant";
import Commodity from "../pages/merchant/commodity";
import { userRoutes } from "./user";
import { getRoutesObj } from "../utils";
import { myRouteObj } from "../type";
const children: myRouteObj[] = [
  {
    path: "commodity",
    element: <Commodity></Commodity>,
  },
];
const primitiveObj = {
  path: "/merchant/*",
  element: <Merchant></Merchant>,
  title: "商店后臺"
};
// 有攔截器版本
export const [routes, defaultRoutes] = getRoutesObj(
  userRoutes,
  primitiveObj,
  children,
  {
    path: "*",
    element: <Navigate to="/merchant/commodity"></Navigate>,
  }
);

getRoutesObj是我自定義的為二級路由添加重定向的工具函數,至于為什么封裝這個函數,其原因就是商家和管理員都要使用,原本是想把重定向添加到最外層,但是這個由于react-router v6并不是嚴格匹配模式,所以即使匹配上路由也會嘗試往下匹配更精確的路由比如/about和/about:id所以封裝了該函數添加二級攔截器

import { myRouteObj } from "../type";
// 第一個參數是復用的數組對象,第二個參數是有攔截器的對象
/**
 *生成路由表配置(加攔截器)
 * @export
 * @param {myRouteObj[]} reuseObj 復用的數組對象
 * @param {myRouteObj} targetObj 目標對象
 * @param {myRouteObj[]} childrenObj 子級路由
 * @param {myRouteObj} globalinterceptorObj 全局攔截路由
 * @param {myRouteObj} interceptor 可選攔截器對象(添加子級路由中)
 */
export function getRoutesObj(
  reuseObj: myRouteObj[],
  targetObj: myRouteObj,
  childrenObj: myRouteObj[],
  interceptorObj?: myRouteObj
) {
  //  先復制一份children
  const children = [...childrenObj];
  //   判斷是否有值
  if (interceptorObj) {
    children.push(interceptorObj);
  }
  return [
    [
      ...reuseObj,
      {
...targetObj,
children: children,
      },
    ],
    [
      ...reuseObj,
      {
...targetObj,
children: [...childrenObj],
      },
    ],
  ];
}

商家入口文件

import React, { Fragment } from "react";
import { Outlet } from "react-router";
import { routes } from "../../router/merchant";
import { useMyRoutes } from "../../hooks/route";
import { myRouteObj } from "../../type";
export default function Merchant() {
  const element = useMyRoutes(routes as myRouteObj[]);
  return (
    <Fragment>
      {element}
      <Outlet></Outlet>
    </Fragment>
  );
}

管理員的和商家的差不多,這里就不再過多敘述了

總結

實現這個權限管理還是花了有一天多的時間,有很多東西沒有這么寫過,也不知道正規的是否應該這樣寫,不過現在還是先實現功能就行了,等之后隨著不斷的練習和學習,也能檢驗我這個方法是否是對的,第一次寫react+TS的項目,仍有很多不足,如果哪位大佬有覺得不妥的地方,也歡迎指出,一同學習,共同進步。

到此這篇關于react-router v6實現權限管理+自動替換頁面標題的文章就介紹到這了,更多相關react-router v6權限內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美一区二区三区激情视频| 岛国av在线播放| 麻豆一区在线| 亚洲欧洲美洲国产香蕉| 蜜芽一区二区三区| 香蕉国产精品| 日韩**一区毛片| 国产人成精品一区二区三| 亚洲精品中文字幕99999| 欧美在线网站| 国产日本精品| 久久电影tv| 国产一区二区三区四区| 91精品亚洲| 亚洲精品激情| 88久久精品| 自拍日韩欧美| 麻豆91精品| 国产h片在线观看| 日韩在线免费| 亚洲精品在线二区| 少妇高潮一区二区三区99| 欧美午夜三级| 麻豆国产在线| 亚洲欧美日本日韩| 国产日韩免费| 日韩成人高清| 亚洲精品亚洲人成在线观看| 精品72久久久久中文字幕| 欧美不卡视频| 国产欧美日韩| 婷婷色综合网| 国产精品成人自拍| 一本色道久久精品| 精品中文字幕一区二区三区| 成人精品视频| 一本一道久久a久久| 日本激情一区| 野花国产精品入口| 麻豆免费精品视频| 99国产精品久久久久久久成人热| 国产欧美综合一区二区三区| jiujiure精品视频播放| 欧美日韩一区二区三区不卡视频 | 久久这里只有精品一区二区| 欧美影院三区| 国产精品久久久久久妇女| 亚洲国产不卡| 国产精品密蕾丝视频下载| 久久一级电影| 精品中文字幕一区二区三区| 免费日韩av片| 欧美一区久久久| 欧美精品97| 99久久久久| 免费在线亚洲| 亚洲精品日韩久久| 激情综合网址| 神马久久午夜| 国产精品qvod| 日韩精品久久理论片| 亚洲精品1区| 国产 日韩 欧美一区| 人人爱人人干婷婷丁香亚洲| 一区二区视频欧美| 色天使综合视频| 动漫av一区| 欧美激情三区| 日韩一区精品| 麻豆亚洲精品| 自由日本语亚洲人高潮| 亚洲性色av| 国产一区二区三区四区二区| 日韩av不卡在线观看| 亚洲欧美日本视频在线观看| 神马日本精品| av资源中文在线| 成人在线观看免费视频| 麻豆国产欧美日韩综合精品二区| 亚洲精品乱码日韩| 热久久免费视频| 亚洲欧美日本国产专区一区| 在线国产一区| 欧美日韩国产高清| 欧美日韩国产一区精品一区| 欧美日韩在线网站| 久久精品av| 亚洲高清毛片| 亚洲激情五月| 亚洲视频播放| 国产精品亚洲欧美一级在线| 日韩精品一区二区三区中文在线 | 亚洲免费网址| 亚洲欧美不卡| 免费日韩av片| 免费观看日韩电影| 亚洲综合图色| 日韩一二三区在线观看| 日韩综合一区二区| 日韩高清一级| 亚洲精品国模| 91麻豆精品激情在线观看最新 | 日韩国产欧美在线视频| 欧美影院视频| 久久尤物视频| 久久久久91| 亚洲欧美日韩在线观看a三区 | 国产一级久久| 老司机精品久久| 亚洲va久久久噜噜噜久久| 日本中文字幕一区二区视频| 久久激情五月激情| 国产极品嫩模在线观看91精品| 久久精品系列| 色婷婷久久久| 麻豆亚洲精品| 国产麻豆精品| 亚洲国产欧美日本视频| 欧美va亚洲va日韩∨a综合色| 亚洲自拍另类| 国产精品亲子伦av一区二区三区| 国产在线不卡一区二区三区| 国产在线不卡| 青青草国产精品亚洲专区无| 国产成人久久| 水野朝阳av一区二区三区| 91精品国产自产观看在线| 国产一区二区三区天码| 久久高清免费| 天堂俺去俺来也www久久婷婷| 久久精品国产一区二区| av亚洲免费| 国产精品中文| 欧美va天堂在线| 国产欧美日韩精品一区二区免费 | 日韩a一区二区| 欧美日韩国产在线观看网站| 亚洲影院天堂中文av色| 精品欧美视频| 六月婷婷一区| 国产一区二区三区不卡视频网站| 婷婷综合亚洲| 国产精品嫩草影院在线看| 欧美一区二区三区高清视频 | 天堂俺去俺来也www久久婷婷| 精品一区二区三区在线观看视频| 不卡在线一区| 久久精品97| 红桃视频亚洲| 国产精品66| 亚洲一区不卡| 中文字幕在线高清| 亚洲精品进入| 99精品在线免费在线观看| 91成人在线网站| 日韩一区二区免费看| 精品国产网站| 日韩av中文字幕一区| 午夜影院欧美| 综合日韩av| 免费观看亚洲天堂| 亚洲五月综合| 成人在线网站| 免费日韩成人| 蜜桃久久久久久| 福利精品一区| 国产精品欧美大片| 日韩中文字幕1| 99久久婷婷这里只有精品| 国产精品一级在线观看| 蜜桃久久久久久| 不卡av一区二区| 高清一区二区| 国产精品成人自拍| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩国产欧美| 欧美激情综合| 青青在线精品| 五月国产精品| 日韩视频一区| 99久久久久| 欧产日产国产精品视频| 国产精品最新| 日韩精品一区二区三区免费视频| 欧美精品一区二区三区精品| 天堂а√在线最新版中文在线| 国产精品www.| 国产精品中文| 国产精品大片| 欧美精品第一区| 欧美国产极品| 麻豆精品国产91久久久久久| 国产午夜久久av| 欧美日韩18| 日韩va亚洲va欧美va久久| 亚洲另类av| 五月亚洲婷婷 | 国产精品尤物| 国产麻豆一区二区三区精品视频| 香蕉久久久久久|