react根據后端返回數據動態添加路由

以下代碼都為部分核心代碼

一.根據不同的登錄用戶,返回不同的權限列表?,以下是三種不同用戶限權列表

const pression = {
//超級管理員BigAdmin: [{key: "screen",icon: "FileOutlined",label: "數據圖表",},{key: "users",icon: "UserOutlined",label: "用戶列表",},{key: "food",icon: "PieChartOutlined",label: "食譜",},{key: "discuss",icon: "CommentOutlined",label: "評論",}],
//普通管理員Admin: [{key: "screen",icon: "FileOutlined",label: "數據圖表",},{key: "food",icon: "PieChartOutlined",label: "食譜",}, {key: "discuss",icon: "CommentOutlined",label: "評論",}],
//普通用戶commont: [{key: "screen",icon: "FileOutlined",label: "數據圖表",}]}

二.實現動態菜單

用戶登錄后先將權限列表存入本地瀏覽器,再跳轉到系統頁面,并在首次加載時候獲取本地權限列表數據,進行動態渲染

//假如登錄的是超級管理員,對應的權限列表應如下,這里使用了ant design的菜單組件,為了方便所以使用符合該菜單組件的數據結構BigAdmin: [{key: "screen",icon: "FileOutlined",label: "數據圖表",},{key: "users",icon: "UserOutlined",label: "用戶列表",},{key: "food",icon: "PieChartOutlined",label: "食譜",},{key: "discuss",icon: "CommentOutlined",label: "評論",}],
//-----------------import * as Icons from '@ant-design/icons';//--自定義組件將字符串轉化為對應的組件---------
const ICONFONT = (props: any) => {const { icon } = props//動態菜單不能確定需要那些icon,全部引入作為Iconsreturn React.createElement(Icons[icon])
}const [Enums, setenum] = useState<any>()const AdminInfo = useSelector((state: any) => state.AdminStore.AdminInfo)
useEffect(() => {
//登錄后,系統首頁獲取本地權限列表,因為這里使用了ant design的icon,需要將字符串轉化為對應的組件,這里封裝的自定義組件let items = JSON.parse(JSON.stringify(AdminInfo.pression))items.map((item: any) => {item.icon = item.icon && <ICONFONT icon={item.icon}></ICONFONT>})setenum([...items])}, [])//在菜單組件中使用<Menu selectedKeys={['screen']} mode="inline" items={Enums} onClick={chooose} />

三.實現動態路由?

先把動態路由和靜態路由分離出來,在路由配置文件中,這里需要進行動態添加的路由為?path: "/backstage"下的子路由,需要給他一個name,后續方便查找


//這里也很重要,頁面加載時候,先判斷本地是否存入了權限列表
import { Admin } from "@/utils/local"
//獲取本地存儲的信息
const rs = Admin.get_Admin()//路由懶加載
const lazyComponent = (Component: FC) => {return <Suspense fallback={Skeletons}><Component /></Suspense>
}//靜態路由
const routers = [{path: '/',element: <Navigate to="/home" />},{path: "/",element: <App />,children: [{path: "/home",element: lazyComponent(Home),},{path: "/category",element: lazyComponent(About),children: [{path: "/category",element: <Navigate to={'/category/mainfood'}></Navigate>},{path: "mainfood",element: lazyComponent(Mainfood)},{path: "bake",element: lazyComponent(Bake)},{path: "beverage",element: lazyComponent(Beverage)},{path: "soup",element: lazyComponent(Soup)}]}, {path: "/user",element: lazyComponent(Test),}, {path: "/edituser",element: lazyComponent(EeditUser)},{path: "/editfood",element: lazyComponent(Edit_Food)}]},{path: "/detaile/:id",element: lazyComponent(Datile)},{path: "/login",element: <Login></Login>},{
//需要動態添加的路由在此處path: "/backstage",element: lazyComponent(Back),name: "back",children: [{path: "/backstage",element: <Navigate to="/backstage/screen"></Navigate>},{path: "screen",element: lazyComponent(Screen)},]},{path: "*",element: <Error></Error>}
]//準備需要添加的動態路由,將添加到 path: "/backstage"的子路由下,
//這里的id必須必須填寫,而且必須唯一, 
//如:id:'4-2',4表示在一級路由下索引為4的路由,2表示在該路由下子路由的索引
const dtRoute = [{path: "users",element: lazyComponent(Users),id: '4-2'},{path: "food",id: '4-3',element: lazyComponent(Food)},{path: "discuss",id: '4-4',element: lazyComponent(Discuss)}
]

定義一個動態添加路由的函數

const dtRoute = [{path: "users",element: lazyComponent(Users),id: '4-2'},{path: "food",id: '4-3',element: lazyComponent(Food)},{path: "discuss",id: '4-4',element: lazyComponent(Discuss)}
]const route = createBrowserRouter(routers)//這里需要導出函數,在登錄后調用,pression即為后端返回的列表
export function addrouter(pression: any[]) {
//找到需要動態添加的路由,name為back,即為之前的path:"/backstage"路由const baseRouter = route.routes.find((rt: any) => rt.name === "back")console.log(baseRouter)if (pression.length !== 0) {//判斷傳入的權限列表是否在動態路由之中,有則追加進去for (const use of pression) {for (const rt of dtRoute) {if (rt.path === use.key) {baseRouter?.children?.push(rt)} else {}}}} else {
//如果傳入的為空表示,退出登錄,更新路由,這里取的最前兩個靜態路由,即刪除動態路由baseRouter?.children?.splice(2)}
}//這里之前已提到,
import { Admin } from "@/utils/local"
const rs = Admin.get_Admin()
//-------頁面刷新時候會重新執行路由文件---訪問其它動態路由的時候會丟失找不到,
//因為動態路由只在登錄的時候進行了添加,而頁面刷新會讓整個路由重新執行,而不會重新動態添加--
//所以刷新的時候要判斷本地是否存儲了動態路由信息,并再次添加
if (rs) {addrouter(rs.pression)
}

在redux中使用動態添加路由的函數

import { createSlice } from "@reduxjs/toolkit";
import { Admin } from "@/utils/local";
import { Admin_Loing } from '@/apis/admin/admin'
import { message } from "antd"
import type { AppDispatch } from "../index"//導入動態添加路由的函數
import { addrouter } from "@/router"
const AdminStore = createSlice({name: "RootStore",initialState: {AdminInfo: Admin.get_Admin() || {pression: [],user: {}}},reducers: {//定義登錄方法,需要在登錄后動態添加路由Login: (state, { payload }) => {state.AdminInfo = payloadAdmin.set_Admin(payload)
//調用動態添加路由的函數,并傳入登錄后傳來的權限列表addrouter(payload.pression)},GoOut: (state) => {state.AdminInfo = {pression: [],user: {}}Admin.remove_Admin()addrouter([])},},
})//導出Login
export const { Login, GoOut } = AdminStore.actions//,登錄是異步的,所以定義異步登錄方法
const axios_admin_login = (data: any) => {return async (dispatch: AppDispatch) => {const res = await Admin_Loing(data)if (res.status == 200) {
//登錄成功后調用Login,并傳入包含權限列表的數據dispatch(Login(res.data))message.success("登錄成功")return true} else {return false}}
}
//最后導出異步登錄,在登錄界面使用
export { axios_admin_login }
export default AdminStore.reducer

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43150.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

谷粒商城學習筆記-使用renren-fast-vue框架時安裝依賴包遇到的問題及解決策略

文章目錄 1&#xff0c;npm error Class extends value undefined is not a constuctor or null2&#xff0c;npm warn cli npm v10.8.1 does not support Node.js v16.20.2.3&#xff0c;npm error code CERT_HAS_EXPIRED學習心得 這篇文章記錄下使用renren-fast-vue&#xff…

QT學習(6)——QT中的定時器事件,兩種實現方式;事件的分發event,事件過濾器

目錄 引出定時器事件QTimerEventQTimer 事件的分發事件過濾器 總結QT中的鼠標事件定義QLable的鼠標進入離開事件提升為myLabel重寫QLabel的函數鼠標的事件鼠標的左中右鍵枚舉鼠標多事件獲取和鼠標移動鼠標追蹤 QT中的信號和槽自定義信號和槽1.自定義信號2.自定義槽3.建立連接4.…

C++ 類和對象 拷貝構造函數

一 拷貝構造函數的概念&#xff1a; 拷貝構造函數是一種特殊的構造函數&#xff0c;用于創建一個對象是另一個對象的副本。當需要用一個已存在的對象來初始化一個新對象時&#xff0c;或者將對象傳遞給函數或從函數返回對象時&#xff0c;會調用拷貝構造函數。 二 拷貝構造函…

打卡第6天----哈希表

每天進步一點點,滴水石穿,日積月累,不斷提升。 數組和鏈表章節告一段落。開啟哈希表相關的。 哈希表能解決什么問題呢,一般哈希表都是用來快速判斷一個元素是否出現集合里 一、有效的字母異位詞 leetcode題目編號:242 題目描述: 給定兩個字符串 s 和 t ,編寫一個函數…

安裝和配置 MSYS2

MSYS2&#xff08;Minimal SYStem 2&#xff09;是一個為Windows平臺提供的輕量級Linux類系統&#xff0c;它集成了大量的GNU工具鏈、工具和庫&#xff0c;為開發者提供了一個類似于Linux的shell環境和完整的開發環境。以下是關于MSYS2的詳細介紹&#xff1a; 一、定義與特點 …

深入理解Java中的泛型編程

深入理解Java中的泛型編程 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 泛型的基礎概念 在Java中&#xff0c;泛型編程是一種強大的編程范式&#xff0c;它允許我們編寫可以操作各種類型的代…

vagrant遠程連接不上問題

如果使用的是vbox虛擬機的host_only的默認ip為56.1開頭如果使用這個1作為地址&#xff0c;只能使用轉發的形式連接&#xff0c;宿主機使用ssh -p 22222 name127.0.0.1 連接&#xff0c;如果配置的主機位大于1則可以使用虛擬機的ip地址連接。 1使用網絡地址轉換&#xff08;ant…

Linux忘記密碼重置root密碼、重置普通用戶密碼

重啟看到選項按e reboot 或 init 62、移動到Linux開頭的行在末尾添加 rw init/bin/bash3、按下Ctrlx引導啟動 mount -o remount,rw /輸入命令回車更改密碼,輸入新密碼&#xff0c;別用小鍵盤&#xff0c;容易出錯 passwd輸入兩次校驗&#xff0c;出現updated successfully就…

OceanBase 配置項系統變量實現及應用詳解(1):配置項的定義及使用方法

《OceanBase 配置項&系統變量實現及應用詳解》專題導讀 在使用OceanBase的過程中&#xff0c;看到大家經常會遇到“參數”、“配置項”、“系統變量”等概念&#xff0c;卻不太清楚它們是不是同一個東西&#xff0c;以及應該如何使用。一些對數據庫開發感興趣的朋友&#…

開源大模型對比

隨著chatgpt誕生&#xff0c;開源大模型的也獲得了突飛猛進的進展&#xff0c;值得關注的是國內本地私有大模型已經在很多真實的場景中落地&#xff0c;比如智能客服。美國的技術研發能力遙遙領先&#xff0c;但是不得不說落地應用這塊是我們的強項。企業使用大模型一般需要考慮…

【面向就業的Linux基礎】從入門到熟練,探索Linux的秘密(九)-git(1)

Git是一個版本管理控制系統&#xff08;縮寫VCS&#xff09;&#xff0c;它可以在任何時間點&#xff0c;將文檔的狀態作為更新記錄保存起來&#xff0c;也可以在任何時間點&#xff0c;將更新記錄恢復回來。 文章目錄 前言 一、git是什么 二、git基本概念 三、git基本命令 總結…

電商項目中分與元金額單位互轉實戰

在Java開發中&#xff0c;可能遇到金額單位的轉換&#xff0c;比如本系統用分作為金額的基本單位&#xff0c;對方系統用元作為金額的基本單位&#xff0c;這就需要進行單位轉換&#xff0c;記錄下來&#xff0c;方便備查。 一、分轉元 分轉元&#xff0c;分到元相差兩位&…

PHP源碼:新聞門戶系統(附管理后臺+前臺)

一. 前言 今天小編給大家帶來了一款可學習&#xff0c;可商用的&#xff0c;新聞門戶系統 源碼&#xff0c;支持二開&#xff0c;無加密。項目可以擴展為個人博客&#xff0c;和一些社交論壇網址。主要功能&#xff1a;支持文章管理&#xff0c;評論管理&#xff0c;分類管理等…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因為key相同都為 name&#xff0c;被后面的覆蓋。Pair("year", 2024),Pair("name", "f…

大語言模型的應用探索AI Agent初探!

前言 大語言模型的應用之一是與大語言模型進行聊天也就是一個ChatBot&#xff0c;這個應用已經很廣泛了。 接下來的一個應用就是AI Agent。 AI Agent是人工智能代理&#xff08;Artificial Intelligence Agent&#xff09;的概念&#xff0c;它是一種能夠感知環境、進行決策…

消防認證-防火窗

一、消防認證 消防認證是指消防產品符合國家相關技術要求和標準&#xff0c;且通過了國家認證認可監督管理委員會審批&#xff0c;獲得消防認證資質的認證機構頒發的證書&#xff0c;消防產品具有完好的防火功能&#xff0c;是住房和城鄉建設領域驗收的重要指標。 二、認證依據…

GEE代碼實例教程詳解:NDVI時間序列趨勢分析

簡介 在本篇博客中&#xff0c;我們將使用Google Earth Engine (GEE) 對MODIS NDVI數據進行時間序列趨勢分析。通過分析2001年至2021年的NDVI數據&#xff0c;我們可以了解植被覆蓋度隨時間的變化趨勢。 背景知識 MODIS數據集 MODIS&#xff08;Moderate Resolution Imagin…

Websocket在Java中的實踐——整合Rabbitmq和STOMP

大綱 Rabbitmq開啟STOMP支持 服務端依賴參數參數映射類配置類邏輯處理類 測試測試頁面Controller測試案例 在《Websocket在Java中的實踐——STOMP通信的最小Demo》一文中&#xff0c;我們使用enableSimpleBroker啟用一個內置的內存級消息代理。本文我們將使用Rabbitmq作為消息代…

【Unity2D 2022:Particle System】添加拾取粒子特效

一、創建粒子特效游戲物體 二、修改粒子系統屬性 1. 基礎屬性 &#xff08;1&#xff09;修改發射粒子持續時間&#xff08;Duration&#xff09;為3s &#xff08;2&#xff09;取消勾選循環&#xff08;Looping&#xff09; &#xff08;2&#xff09;修改粒子存在時間&…