IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> react 后台管理项目中 结合antd (v4.0) 动态生成左侧菜单栏 -> 正文阅读

[JavaScript知识库]react 后台管理项目中 结合antd (v4.0) 动态生成左侧菜单栏

一级路由:

  • /login
  • /admin

下面配置admin的二级路由

1.准备好数据

假设从后台得到的数据结构(根据不同角色返回的不同菜单数据)

const menuList = [
	{
        title: '首页',
        icon: '<HomeOutlined />',
        key: '/index',
    },
    {
        title: '商品',
        icon: '<ShopOutlined />',
        key: '/productCate',
        children:[
            {
                title: '品类管理',
        		icon: '<BarsOutlined />',
        		key: '/category',
            },
            {
                title: '商品管理',
        		icon: '<CalendarOutlined />',
        		key: '/product',
            }
            
        ]
        
    }
    {
        title: '用户管理',
        icon: '<UserOutlined />',
        key: '/user',
    },
    {
        title: '角色管理',
        icon: '<SafetyCertificateOutlined />',
        key: '/role',
    },
    
]

2.利用antd提供的菜单menu渲染

//leftMenu.jsx'
import { Menu } from 'antd';
import {
  HomeOutlined,
  ShopOutlined,
  BarsOutlined,
  CalendarOutlined,
  UserOutlined,
  SafetyCertificateOutlined,
} from '@ant-design/icons';
const { SubMenu } = Menu;

class LeftMenu extends React.Component {
  
 getMenuNodes(menuList){
     menuList.map(item=>{
        if(!item.children){
            return (
                <Menu.Item key={item.key} icon={item.icon}>
                     <Link to={item.key}>
                		{item.title}
                     </Link>
               	</Menu.Item>
            )
        }else{
            return (
          		<SubMenu key={item.key} icon={item.icon} title={item.title}>
                    this.getMenuNodes(item.children)
                </SubMenu>
            )
        }
     })
 }
  render() {
    return (
      <div style={{ width: 256 }}>
        <Menu
          mode="inline"
          theme="dark"
        >
              {this.getMenuNodes(this.menuList)}
        </Menu>
      </div>
    );
  }
}
export default class LeftMenu;

3.几个小细节

1.点击菜单跳转路由

<!--菜单标签里面套一个Link标签-->
<Link to={item.key}>
    <Menu.Item key={item.key} icon={item.icon}>
         <Link to={item.key}>
            {item.title}
         </Link>
    </Menu.Item>
</Link>

2.动态生成菜单

//利用 数组的map方法+递归 (如上代码)
//或者 数组的reduce方法+递归

//reduce方法的两个参数:参数一函数(pre累加的结果,),参数二:初始化的值
getMenuNodes(menuList){
    menuList.reduce((pre,item)=>{ 
        if(!item.children){
            pre.push(<Menu.Item key={item.key} icon={item.icon}>
                     <Link to={item.key}>
                		{item.title}
                     </Link>
               	</Menu.Item>)
        }else{
            pre.push(<SubMenu key={item.key} icon={item.icon} title={item.title}>
                        {this.getMenuNodes(item.children)}
                    </SubMenu>)
        }
        return pre;//一定要把累加结果返回出去,看着别map方法稍麻烦一点
    },[])
}

3.自动选中当前菜单项

  • defaultSelectedKeys ,初始选中的菜单项 key 数组只能保证页面刚打开时默认展示的菜单项,但是页面刷新后,就失效了;

  • selectedKeys 当前展开的 SubMenu 菜单项 key 数组,可以是动态的;

那么怎么得到当前请求的路由路径呢?

我们知道,路由组件有三个属性,可以从里面的this.props.location.pathname中得到,但是LeftMenu只是Admin组件的一个子组件,不是路由组件,要想让普通组件变成路由组件,拥有三大属性,react提供了一个方法,就是利用高阶组件withRouter

import {withRouter} from 'react-router-dom'
class LeftMenu extends React.Component{
    //....
    render(){
        const key = this.props.location.pathname;//2.获取当前请求的路由路径 3.把给Menu的selectedKeys属性(数据中key跟path的值一样)
        return (
        	<Menu
              mode="inline"
              theme="dark"
              selectedKeys={[key]}
            >
                  {this.getMenuNodes(this.menuList)}
            </Menu>
        )
    }
}
export default withRouter(<LeftMenu />) //1.暴漏的时候包裹一个withRouter即可!!!!!!!!!

4.自动打开当前子列表

  • defaultOpenKeys 初始展开的 SubMenu 菜单项 key 数组
  • openKeys 当前展开的 SubMenu 菜单项 key 数组
<Menu
  mode="inline"
  theme="dark"
  selectedKeys={[key]}
  openKeys={[this.openKey]}
>
      {this.getMenuNodes(this.menuList)}
</Menu>
//那么这个openKey怎么拿到呢?????,下面:
//通过调用getMenuNodes得到openKeys,并保存在this中
getMenuNodes(menuList){
    const path = this.props.location.pathname;
     menuList.map(item=>{
        if(!item.children){
            return (
                <Menu.Item key={item.key} icon={item.icon}>
                     <Link to={item.key}>
                		{item.title}
                     </Link>
               	</Menu.Item>
            )
        }else{
            //查找一个与当前请求路径匹配的子Item
            const cItem = item.children.find(cItem.key===path)
    		if(cItem){//如果存在,说明当前Item的子列表需要打开
                this.openKey = item.key
            }
            return (
          		<SubMenu key={item.key} icon={item.icon} title={item.title}>
                    {this.getMenuNodes(item.children)}
                </SubMenu>
            )
        }
     })
 }
 //但是生成菜单nodes的方法getMenuNodes是在 render()函数中return时才调用的,但是使用openKeys是在render函数return之前使用的,所以拿不到。
 

所以我们需要在render() 最上面先调用getMenuNodes(),但是放在render()函数中,每次更新的话,都要调用,所以最好放在componentWillMount声明周期中调用:

componentWillMount(){
    this.menuNodes = this.getMenuNodes(this.menuList)
}
render(){
    return (
    	<SubMenu key={item.key} icon={item.icon} title={item.title}>
                {this.menuNodes}   
        </SubMenu>
    )
}
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:41:13  更:2022-03-13 21:41:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:19:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码