ant design pro v5 动态路由

2023-11-18

1.添加模拟数据

//路径
//mock/menu.ts


export default {
  '/api/getMenuData': [

      {
        path: '/user',
        routes: [
          {
            path: '/user',
            routes: [
              {
                name: 'login',
                path: '/user/login',
                component: './user/Login',
              },
            ],
          },
        ],
      },
      {
        path: '/welcome',
        name: 'welcome',
        icon: 'smile',
        component: './Welcome',
      },
      {
        path: '/admin',
        name: 'admin',
        icon: 'crown',
        access: 'canAdmin',
        component: './Admin',
        routes: [
          {
            path: '/admin/sub-page',
            name: 'sub-page',
            icon: 'smile',
            component: './Welcome',
          },
        ],
      },
      {
        name: 'list.table-list',
        icon: 'table',
        path: '/list',
        component: './TableList',
      },
      {
        path: '/',
        redirect: '/welcome',
      },
      {
        component: './404',
      }
  ]
};


2.添加request请求

//路径
//services/getMenu.ts

export async function getMenuData() {
  return request('/api/getMenuData',{
    method:'GET',
  });
}

3.修改app.tsx文件

a.第一步修改getInitialState

export async function getInitialState(): Promise<{
  settings?: Partial<LayoutSettings>;
  currentUser?: API.CurrentUser;
  menuData?: MenuDataItem[] | undefined;
  fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
}> {
  const fetchUserInfo = async () => {
    try {
      const currentUser = await queryCurrentUser();
      return currentUser;
    } catch (error) {
      history.push(loginPath);
    }
    return undefined;
  };
  // 如果是登录页面,不执行
  if (history.location.pathname !== loginPath) {
    const currentUser = await fetchUserInfo();
    const menuData = await getMenuData();
    return {
      fetchUserInfo,
      currentUser,
      menuData,
      settings: {},
    };
  }
  return {
    fetchUserInfo,
    menuData: [],
    settings: {},
  };
}

b.第二步修改layout

export const layout = ({initialState}: {
  initialState: { settings?: LayoutSettings; currentUser?: API.CurrentUser, menuData: MenuDataItem[]; };
}): BasicLayoutProps => {
  console.log(initialState)
  return {
    menuDataRender: (menuData) => initialState.menuData || menuData,
    rightContentRender: () => <RightContent/>,
    disableContentMargin: false,
    footerRender: () => <Footer/>,
    onPageChange: () => {
      // 如果没有登录,重定向到 login
      if (!initialState?.currentUser?.userid && history.location.pathname !== '/user/login') {
        history.push('/user/login');
      }
    },
    menuHeaderRender: undefined,
    ...initialState?.settings,
  };
};

4.app.tsx 完整代码

import type {Settings as LayoutSettings, BasicLayoutProps} from '@ant-design/pro-layout';
import type {MenuDataItem} from '@ant-design/pro-layout';
import {PageLoading} from '@ant-design/pro-layout';
import {notification} from 'antd';
import type {RequestConfig} from 'umi';
import {history} from 'umi';
import RightContent from '@/components/RightContent';
import Footer from '@/components/Footer';
import type {ResponseError} from 'umi-request';
import {currentUser as queryCurrentUser, getMenuData} from './services/ant-design-pro/api';

const loginPath = '/user/login';


/** 获取用户信息比较慢的时候会展示一个 loading */
export const initialStateConfig = {
  loading: <PageLoading/>,
};

/**
 * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state
 * */
export async function getInitialState(): Promise<{
  settings?: Partial<LayoutSettings>;
  currentUser?: API.CurrentUser;
  menuData?: MenuDataItem[] | undefined;
  fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
}> {
  const fetchUserInfo = async () => {
    try {
      const currentUser = await queryCurrentUser();
      return currentUser;
    } catch (error) {
      history.push(loginPath);
    }
    return undefined;
  };
  // 如果是登录页面,不执行
  if (history.location.pathname !== loginPath) {
    const currentUser = await fetchUserInfo();
    const menuData = await getMenuData();
    return {
      fetchUserInfo,
      currentUser,
      menuData,
      settings: {},
    };
  }
  return {
    fetchUserInfo,
    menuData: [],
    settings: {},
  };
}

export const layout = ({initialState}: {
  initialState: { settings?: LayoutSettings; currentUser?: API.CurrentUser, menuData: MenuDataItem[]; };
}): BasicLayoutProps => {
  console.log(initialState)
  return {
    menuDataRender: (menuData) => initialState.menuData || menuData,
    rightContentRender: () => <RightContent/>,
    disableContentMargin: false,
    footerRender: () => <Footer/>,
    onPageChange: () => {
      // 如果没有登录,重定向到 login
      if (!initialState?.currentUser?.userid && history.location.pathname !== '/user/login') {
        history.push('/user/login');
      }
    },
    menuHeaderRender: undefined,
    ...initialState?.settings,
  };
};


const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队(异步任务)。',
  204: '删除数据成功。',
  400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限(令牌、用户名、密码错误)。',
  403: '用户得到授权,但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
  405: '请求方法不被允许。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除,且不会再得到的。',
  422: '当创建一个对象时,发生一个验证错误。',
  500: '服务器发生错误,请检查服务器。',
  502: '网关错误。',
  503: '服务不可用,服务器暂时过载或维护。',
  504: '网关超时。',
};

/** 异常处理程序
 * @see https://beta-pro.ant.design/docs/request-cn
 */
const errorHandler = (error: ResponseError) => {
  const {response} = error;
  if (response && response.status) {
    const errorText = codeMessage[response.status] || response.statusText;
    const {status, url} = response;

    notification.error({
      message: `请求错误 ${status}: ${url}`,
      description: errorText,
    });
  }

  if (!response) {
    notification.error({
      description: '您的网络发生异常,无法连接服务器',
      message: '网络异常',
    });
  }
  throw error;
};

// https://umijs.org/zh-CN/plugins/plugin-request
export const request: RequestConfig = {
  errorHandler,
};

5.解决icon问题

a.utils下面创建fixMenuItemIcon.ts

//  路径
//  src/utils/fixMenuItemIcon.ts

import React from 'react';
import {MenuDataItem} from '@ant-design/pro-layout';
import * as allIcons from '@ant-design/icons';

// FIX从接口获取菜单时icon为string类型
const fixMenuItemIcon = (menus: MenuDataItem[], iconType = 'Outlined'): MenuDataItem[] => {
  menus.forEach((item) => {
    const {icon, children} = item
    if (typeof icon === 'string') {
      const fixIconName = icon.slice(0, 1).toLocaleUpperCase() + icon.slice(1) + iconType
      // eslint-disable-next-line no-param-reassign
      item.icon = React.createElement(allIcons[fixIconName] || allIcons[icon])
    }
    // eslint-disable-next-line no-param-reassign,@typescript-eslint/no-unused-expressions
    children && children.length > 0 ? item.children = fixMenuItemIcon(children) : null
  });
  return menus
};

export default fixMenuItemIcon;

b. app.tsx引入import fixMenuItemIcon from ‘./utils/fixMenuItemIcon’

// 引入fixMenuItemIcon
import fixMenuItemIcon from './utils/fixMenuItemIcon'


//修改 app.tsx 里的 menuDataRender
 menuDataRender: () =>{
      return  fixMenuItemIcon(initialState.menuData)
    },
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ant design pro v5 动态路由 的相关文章

随机推荐

  • SQL SERVER 提取字符串中数字

    对一个字符串进行提取 获取其中数字部分 方法如下 IF OBJECT ID DBO GET NUMBER IS NOT NULL DROP FUNCTION dbo GET NUMBER GO CREATE FUNCTION dbo GET
  • 集装箱装柜计算机器在线,装箱大师在线计算教程

    原创装箱大师在线计算教程 编辑 小葫芦 来源 PC下载网时间 2018 01 08 10 34 38 1 对于从事装箱设计工作的小伙伴来说 如何高效快速的装箱一直是个难题 不过装箱大师这款软件可以帮助大家解决这个难题 接下来小编就来教大家如
  • UPnP的介绍和理解

    在远程服务器开了一个节点B 然后在自己电脑上启动两个节点A C 用了 bootnodes B命令 A和C都能把B节点添加到自己的列表里 但是A和C不能互相发现是为什么 按理来说B应该把自己知道的节点列表都告诉给他相连的节点吧 答案是 它们会
  • 崇德科技深交所上市:上半年营收2.6亿募资10亿 市值48亿

    雷递网 雷建平 9月20日 湖南崇德科技股份有限公司 简称 崇德科技 证券代码 301548 今日在深交所创业板上市 崇德科技本次发行1500万股 发行价66 8元 募资10亿元 崇德科技原计划募资5 3亿元 这意味着超募了近5亿元 崇德科
  • K9s之Kubernetes集群管理交互工具实践

    文章目录 0x01 基础简介 0x02 安装实践 安装流程 配置示例 0x02 命令实践 命令参数 简单使用 0x01 基础简介 K9s Kubernetes CLI To Manage Your Clusters In Style 描述
  • 快速排序 详解(快速排序 双路快排 三路快排)

    注 内容 图片来自于慕课网liuyubobobo老师的课程 官方代码链接 https github com liuyubobobo Play with Algorithms 快速排序 快速排序可以说是20世纪最伟大的算法之一了 相信都有所耳
  • Stm32 一键下载电路详解

    文章目录 前言 一键下载 一键下载原理 硬件原理图 跳帽与启动 存储映射 串口下载程序由来 一键下载流程 通过 USB 控制机器复位握手 解读 前言 最近在又要折腾 stm32 了 所以翻出了角落里的开发板 先复习下怎么一键下载来着 一键下
  • linux中安装mysql时报错解决方案

    转载于http www cnblogs com xiaolang8762400 p 6950920 html 找了很久才找到 谢谢大神 本人需要找的问题主要是安装时出错的解决方法 本人的文件版本跟原创的版本有点不一样 需要哪个版本自行选择
  • 实战:从Mysql数据库frm文件中,提取表结构创建SQL语句

    需求 在某些特殊的场景下 例如你的mysql数据库无法启动 需要你将表的ibd文件拷贝到另一个数据库中 恢复业务数据库 恢复业务数据的前提 是你需要在另一个数据库中 创建好一模一样的表结构 这时你就需要从Mysql数据库的frm文件中 提取
  • Mysql查询日期timestamp格式的数据

    在Navicat中 时间戳 timestamp 格式的数据表现为 查询某一天的数据 SELECT FROM my table WHERE update time LIKE 2022 10 06 或是 SELECT FROM my table
  • 如何成功开展网络营销?

    企业如要将网上营销开展成功 则必须注意以下方面 1 准确 客观的市场定位 网上营销同传统的营销相比 其前期工作也包括准确客观的市场定位 网上营销与一般营销有较大的区别 因此其市场定位也有其独特的特点 如何准确客观地进行网上营销的市场定位 必
  • CentOS8更换阿里源及解决yum update报错问题

    CentOS更换阿里源 yum makecache提示错误 为 repo base 下载元数据失败 Cannot download repomd xml Cannot download repodata repomd xml All mir
  • GitHub的使用

    文章目录 一 通过实际操作学习Git 1 Git基本操作 2 分支操作 3 更改提交操作 4 推送至远程仓库 5 从远程仓库获取 6 帮助大家深入理解Git资料 二 工具栏 1 键盘快捷键 2 工具栏 3 控制面板 4 仓库 三 与GitH
  • vite插件介绍 - vite-plugin-meta-env

    vite插件介绍 vite plugin meta env a vite plugin define dynamic env variables in import meta env npm github 可以基于本仓库去开发自己的vite
  • 微信小程序怎么设置单个页面颜色/顶部栏颜色/tabBar颜色

    微信小程序怎么设置单个页面的背景颜色 这个其实很简单 看看酱茄小编是怎么操作的 在对应的json里面写入以下代码即可 单页页面的背景颜色设置方法 navigationBarBackgroundColor FFFFFF 小程序tabBar 底
  • 数据清洗---数据整合

    数据整合可以使用Pandas库中merge 函数合并数据集 import pandas as pd 建两个数据集 df1 DataFrame lkey b b a c data1 range 4 df2 DataFrame rkey a b
  • 写selenium常用到的js代码

    selenium可以运行JavaScript代码 可以用一些JavaScript来辅助编写Selelnium代码 1 scrollIntoView 向下拉滚动条 使得某元素可见 IWebElement element driver Find
  • tensorflow NameError: name ‘layers‘ is not defined解决办法

    错误代码 import tensorflow as tf net layers Dense 10 net build 4 10 net kernel NameError name layers is not defined 错误原因 ten
  • 如何使用jquery通过id值修改指定的input的value值

    如何使用jquery通过id值修改指定的input的value值 定义和用法 示例代码 改变动态id的input值 定义和用法 val 方法返回或设置被选元素的值 元素的值是通过 value 属性设置的 该方法大多用于 input 元素 如
  • ant design pro v5 动态路由

    ant design pro v5 动态菜单 1 添加模拟数据 2 添加request请求 3 修改app tsx文件 a 第一步修改getInitialState b 第二步修改layout 4 app tsx 完整代码 5 解决icon