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

React-Router v6實(shí)現(xiàn)頁(yè)面級(jí)按鈕權(quán)限示例詳解

 更新時(shí)間:2023年10月04日 11:46:27   作者:程序員王天  
這篇文章主要介紹了使用 reac+reactRouter來(lái)實(shí)現(xiàn)頁(yè)面級(jí)的按鈕權(quán)限功能,這篇文章分三部分,實(shí)現(xiàn)思路、代碼實(shí)現(xiàn)、踩坑記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助

前言

通常情況下,咱們?yōu)橛脩籼砑訖?quán)限時(shí),除了頁(yè)面權(quán)限,還會(huì)細(xì)化到按鈕級(jí)別,比如、新增、刪除、查看等權(quán)限。

如下效果,切換用戶登錄后,操作權(quán)限除了左側(cè)菜單,還有頁(yè)面按鈕。

實(shí)現(xiàn)思路

按鈕控制本質(zhì)是條件判斷,滿足條件顯示按鈕,否則禁用/消失。

假如每個(gè)頁(yè)面的按鈕權(quán)限都不同,簡(jiǎn)單的條件判斷,肯定無(wú)法滿足,那如何實(shí)現(xiàn)呢 ?

王天覺得重點(diǎn)是權(quán)限數(shù)據(jù)結(jié)構(gòu),如何獲取當(dāng)前頁(yè)面的按鈕權(quán)限數(shù)據(jù),這需要和后端溝通好,定義頁(yè)面路徑和權(quán)限數(shù)據(jù)的映射關(guān)系

使用路由實(shí)現(xiàn)頁(yè)面按鈕權(quán)限

步驟:

  • 在路由配置中添加頁(yè)面權(quán)限參數(shù)
  • 通過路由實(shí)例,獲取當(dāng)前頁(yè)的權(quán)限
  • 封裝按鈕權(quán)限組件,動(dòng)態(tài)顯隱按鈕

實(shí)戰(zhàn)代碼

定義路由配置數(shù)據(jù)

需和后端配合,將按鈕權(quán)限和頁(yè)面路由一同返回

存儲(chǔ)路由和按鈕權(quán)限映射關(guān)系

既然無(wú)法通過路由實(shí)例獲取權(quán)限數(shù)據(jù),那么我們手動(dòng)創(chuàng)建一個(gè)對(duì)象,來(lái)存儲(chǔ)路由和按鈕權(quán)限映射關(guān)系。
用戶登錄后,在遍歷生成路由配置同時(shí)、將按鈕權(quán)限和頁(yè)面路徑的映射數(shù)據(jù),存儲(chǔ)本地。

執(zhí)行如下代碼

按鈕權(quán)限組件

封裝按鈕權(quán)限組件,讀取本地權(quán)限數(shù)據(jù)、控制按鈕的顯隱、禁用狀態(tài),代碼如下:

import { Tooltip } from 'antd';
import React from 'react';
import { useLocation } from 'react-router-dom';
interface IndexProps {
  scopeTtype:string, // 權(quán)限碼
  children:any// 子組件
}
const Index: React.FC<IndexProps> = (props) => {
  // 獲取當(dāng)前頁(yè)面的位置信息、
  const routeDom = useLocation(); 
  // 從本地緩存讀取 頁(yè)面路徑和權(quán)限數(shù)據(jù)
  const strPersstion = localStorage.getItem('pagePersstion');
  const pagePersstion = JSON.parse(strPersstion as string); 
  // 找到當(dāng)前頁(yè)的按鈕權(quán)限數(shù)據(jù)
  const currentPerssion = pagePersstion.find((item: { page: string; })=>item.page == routeDom.pathname);
  console.log('當(dāng)前頁(yè)面的按鈕權(quán)限',currentPerssion);
  //  有權(quán)限返回按鈕
  if(currentPerssion.permissions[props.scopeTtype]){
    return  props.children;
  }else{ 
    // 沒有則禁用、或者隱藏按鈕
    // 要實(shí)現(xiàn)按鈕禁用,需要設(shè)置組件的disabled 
    // 可是react 中的props是只讀無(wú)法修改,如何修改props中子組件呢?
    // 通過React API React.cloneElement 克隆出新的元素進(jìn)行修改如下
    const Button = React.cloneElement(props.children, {
      disabled: true
    });
    return   <>
      <Tooltip title="暫無(wú)權(quán)限">  {Button}</Tooltip>
    </>;
  };
};
export default Index;

使用按鈕權(quán)限組件

<AuthButton scopeTtype="isDelete">
  <Button type="primary" onClick={start} disabled={!hasSelected} loading={loading}>
    批量刪除
  </Button>
</AuthButton>
<AuthButton scopeTtype="isAdd">
    <Button onClick={showModal}>新增員工</Button>
</AuthButton>

模擬的路由數(shù)據(jù):?jiǎn)T工管理頁(yè)面的路由、按鈕配置

效果:

當(dāng)切換用戶登錄后,很明細(xì)發(fā)現(xiàn)右側(cè)表格、操作按鈕權(quán)限變化。效果如下


以上全文完,最后總結(jié)一下reactRoute和vueRouter的實(shí)現(xiàn)區(qū)別。

vueRouter vs ReactRouter

vueRouter

此方案中,在vue中實(shí)現(xiàn)比較方便,使用vueRouter配置路由meta元信息、為按鈕權(quán)限的數(shù)據(jù)

{
  path: '/imgMove/:id',
    name: 'imgMove',
    meta: {
    itwangtianAuth: true
    // 此頁(yè)面是否token校驗(yàn)
  },
  component: imgMove
}

在頁(yè)面路由實(shí)例中讀取meta數(shù)據(jù),進(jìn)行頁(yè)面級(jí)別的按鈕權(quán)限控制。

// 在 Vue 組件中獲取路由的 meta 數(shù)據(jù)
export default {
  name: 'ExampleComponent',
  mounted() {
    // 獲取當(dāng)前路由對(duì)應(yīng)的路由記錄
    const route = this.$route; 
    // 獲取該路由記錄的 meta 數(shù)據(jù)
    const meta = route.meta; 
    // 使用 meta 數(shù)據(jù)
    console.log(meta.itwangtianAuth); 
  }
}

ReactRouter

但是,在react-Router6版本中沒有路由元信息配置,就算自定義路由屬性,也無(wú)法獲取,如下是踩坑代碼,大家看看就行、可不要嘗試了

踩坑記錄

踩坑代碼-添加路由自定義屬性,獲取權(quán)限數(shù)據(jù)首先,在路由配置中設(shè)置自定義屬性,例如 title 和 requiresAuth:

<Route
  path="/dashboard"
  element={<Dashboard />}
  title="Dashboard"
  requiresAuth={true}
  />

然后,在 Dashboard 組件中可以通過 useRoutes() 鉤子獲取路由傳遞的屬性,如下所示:

import { useRoutes, useParams, useNavigate } from 'react-router-dom';
function Dashboard() {
  const params = useParams();
  const navigate = useNavigate();
  // 訪問路由傳遞的屬性
  const { title, requiresAuth } = useRoutes().pathname;
  // 在這里使用元信息進(jìn)行邏輯處理
  return (
    <div>
      <h1>{title}</h1>
      {/* 組件的其余部分 */}
    </div>
  );
}

結(jié)果不用說(shuō)了,報(bào)錯(cuò)啊啊啊啊啊啊啊

在react-route6中 無(wú)法自定義路由屬性,報(bào)錯(cuò)日志如下

以上就是React-Router v6實(shí)現(xiàn)頁(yè)面級(jí)按鈕權(quán)限示例詳解的詳細(xì)內(nèi)容,更多關(guān)于React Router v6頁(yè)面級(jí)按鈕權(quán)限的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React+Webpack快速上手指南(小結(jié))

    React+Webpack快速上手指南(小結(jié))

    這篇文章主要介紹了React+Webpack快速上手指南(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-08-08
  • React中props使用教程

    React中props使用教程

    props是組件(包括函數(shù)組件和class組件)間的內(nèi)置屬性,用其可以傳遞數(shù)據(jù)給子節(jié)點(diǎn),props用來(lái)傳遞參數(shù)。組件實(shí)例化過程中,你可以向其中傳遞一個(gè)參數(shù),這個(gè)參數(shù)會(huì)在實(shí)例化過程中被引用
    2022-09-09
  • React中使用Redux Toolkit狀態(tài)管理的示例詳解

    React中使用Redux Toolkit狀態(tài)管理的示例詳解

    在現(xiàn)代 React 應(yīng)用程序中,狀態(tài)管理是一個(gè)至關(guān)重要的部分,使用 Redux Toolkit 可以簡(jiǎn)化 Redux 的配置和管理,本文將通過三個(gè)文件的示例,詳細(xì)講解如何使用 Redux Toolkit 創(chuàng)建和管理一個(gè)簡(jiǎn)單的計(jì)數(shù)器狀態(tài),需要的朋友可以參考下
    2024-11-11
  • React不使用requestIdleCallback實(shí)現(xiàn)調(diào)度原理解析

    React不使用requestIdleCallback實(shí)現(xiàn)調(diào)度原理解析

    這篇文章主要為大家介紹了React不使用requestIdleCallback實(shí)現(xiàn)調(diào)度原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React Native之TextInput組件解析示例

    React Native之TextInput組件解析示例

    本篇文章主要介紹了React Native之TextInput組件解析示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-08-08
  • 在?React?中使用?Context?API?實(shí)現(xiàn)跨組件通信的方法

    在?React?中使用?Context?API?實(shí)現(xiàn)跨組件通信的方法

    在React中,ContextAPI是一個(gè)很有用的特性,可用于組件間的狀態(tài)共享,它允許跨組件傳遞數(shù)據(jù)而無(wú)需通過每個(gè)組件手動(dòng)傳遞props,本文給大家介紹在?React?中如何使用?Context?API?來(lái)實(shí)現(xiàn)跨組件的通信,感興趣的朋友一起看看吧
    2024-09-09
  • react-native 封裝視頻播放器react-native-video的使用

    react-native 封裝視頻播放器react-native-video的使用

    本文主要介紹了react-native 封裝視頻播放器react-native-video的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • React this.setState方法使用原理分析介紹

    React this.setState方法使用原理分析介紹

    我們知道,在React中沒有像Vue那種數(shù)據(jù)雙向綁定的效果。而this.setState方法就是用來(lái)對(duì)數(shù)據(jù)進(jìn)行更改的。而通過this.setState方法更改的數(shù)據(jù),會(huì)讓組件的render重新渲染,并且刷新數(shù)據(jù)
    2022-09-09
  • 40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理

    40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理

    這篇文章主要介紹了40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • react數(shù)組循環(huán)渲染過程

    react數(shù)組循環(huán)渲染過程

    在React中,我們使用map方法對(duì)數(shù)組進(jìn)行循環(huán)渲染,并生成對(duì)應(yīng)的jsx結(jié)構(gòu),為了確保React的diff算法可以正確地處理dom對(duì)象,我們需要為每個(gè)生成的元素添加key屬性,注意:雖然不添加key屬性代碼可以運(yùn)行,但會(huì)報(bào)錯(cuò)
    2026-05-05

最新評(píng)論

古丈县| 丹东市| 临漳县| 博兴县| 屏东县| 茌平县| 伊金霍洛旗| 中牟县| 固始县| 洮南市| 洛隆县| 汽车| 黎城县| 嘉定区| 罗平县| 巴里| 通渭县| 固安县| 海南省| 若羌县| 云阳县| 景洪市| 长治县| 天等县| 枞阳县| 龙门县| 维西| 天全县| 奈曼旗| 渝北区| 读书| 临安市| 武城县| 洪雅县| 永仁县| 韶山市| 汉川市| 行唐县| 奇台县| 绥化市| 苗栗县|