iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >react如何实现三级菜单
  • 689
分享到

react如何实现三级菜单

2023-07-05 01:07:43 689人浏览 泡泡鱼
摘要

这篇文章主要讲解了“React如何实现三级菜单”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现三级菜单”吧!react实现三级菜单的方法:1、创建展开三级父级菜单的方法为“o

这篇文章主要讲解了“React如何实现三级菜单”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现三级菜单”吧!

react实现三级菜单的方法:1、创建展开三级父级菜单的方法为“onOpenChange = (openKeys) => {...}”;2、通过“handleSelectkeys(e){...}”设置选中状态;3、通过“oli.push(<Menu.Item key={...})实现生成侧边栏即可。

react + antd实现只展开一个父级菜单栏的侧边栏(三级菜单栏)

展开三级父级菜单的方法

onOpenChange = (openKeys) => {
       const latestOpenKey = openKeys.find(key => this.state.openKeys.indexOf(key) === -1);
       let openList;
       if(this.state.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
           if(latestOpenKey&&latestOpenKey.length===3){
               openList = this.state.openKeys.filter((e)=>{
                   return e.length!==3;
               })
               this.setState({
                   openKeys:openList                });
           }else{
               this.setState({
                   openKeys:openKeys                });
           }          
       }else{
           if(latestOpenKey&&latestOpenKey.length===3){
               openList = this.state.openKeys.filter((e)=>{
                   return e.length!==3;
               })
               openList.push(latestOpenKey);
               this.setState({
                   openKeys:openList[1] ? openList : [openList[0],openList[2]]
               });
           }else{
               this.setState({
                   openKeys: latestOpenKey ? [latestOpenKey] : [],
               });
           }            
       }
   }

设置选中状态

 handleSelecTKEys(e){
       if(this.state.isshow){
           this.setState({
               selectedKey:e.key,
               openKeys:e.keyPath[length] == 3  ? [e.keyPath[2],e.keyPath[1]] : [e.keyPath[0]],
               isShow:true
            });
       }      
   }

生成侧边栏

const data = this.props.list;
       var html = [];
       for(var i=0;i<data.length;i++){
           if(data[i].children){
               var li = []
               for(var j=0;j<data[i].children.length;j++){
                   var liData = data[i].children[j];
                   if(liData.children){
                       var oli = [];
                       for(var k=0;k<liData.children.length;k++){
                           oli.push(
                               <Menu.Item key={liData.children[k].url}>
                                   <Link to={
                                       {
                                           pathname:liData.children[k].url,
                                           state:{//三级菜单下传openKeys传两个值,展开两级
                                               parent:this.state.openKeys[0],
                                               child:this.state.openKeys[1]
                                           }
                                       }
                                   }>
                                       <span>{liData.children[k].text}</span>
                                   </Link>
                               </Menu.Item>
                           )
                       }
                       var oul = <SubMenu key={liData.id} title={<span>{liData.iconCls && <Icon type={liData.iconCls} />}<span>{liData.text}</span></span>}>{oli}</SubMenu>;
                       li.push(oul);
                   }else{
                       li.push(
                           <Menu.Item key={liData.url}>
                               <Link to={
                                   {
                                       pathname:liData.url,
                                       state:{//二级菜单下openKeys传一个值,展开一级
                                           parent:this.state.openKeys[0],
                                           // child:this.state.openKeys[1] ? this.state.openKeys[1] : ''
                                       }
                                   }
                                   
                                   } >
                                   {liData.iconCls && <Icon type={liData.iconCls} />}
                                   <span>{liData.text}</span>
                               </Link>
                           </Menu.Item>
                       );
                   }
               }
               var ul = <SubMenu key={data[i].id} title={<span>{data[i].iconCls && <Icon type={data[i].iconCls} />}<span>{data[i].text}</span></span>}>{li}</SubMenu>;
               html.push(ul);
           }else{
               html.push(
                   <Menu.Item key={data[i].url}>
                       <Link to={                          
                           {
                               pathname:data[i].url,
                               state:{//一级菜单下传空值,不展开菜单栏
                                   parent:''
                               }
                           }
                           } >
                           {data[i].iconCls && <Icon type={data[i].iconCls} />}
                           <span>{data[i].text}</span>
                       </Link>
                   </Menu.Item>
               )
           }
       }

侧边栏组件Menu.js 全部代码

import React from 'react'import { Menu,Icon } from 'antd';import {Link,withRouter} from 'react-router-dom'const { SubMenu } = Menu;

class Menus extends React.Component{
   constructor(props){
       super(props)
       this.state={
           openKeys:['1','100'],
           rootSubmenuKeys:[],
           selectedKeys:[this.props.history.location.pathname], //选中
           isShow:false //判断是否已经展开,如已展开停止重新赋值避免重新渲染和关系菜单        
       }
       this.handleSelectkeys = this.handleSelectkeys.bind(this)
   }
   UNSAFE_componentWillMount(){
       if(this.props.location.state){
           this.setState({
               openKeys:[this.props.location.state.parent,this.props.location.state.child ? this.props.location.state.child : '']
           })          
       }
         
     }
   componentDidMount(props,nextProps){
       var data = this.props.list;
       for(var i=0;i<data.length;i++){
           if(data[i].children){
               for(var j=0;j<data[i].children.length;j++){
                   var liData = data[i].children[j];
                   if(liData.children){
                       this.state.rootSubmenuKeys.push(liData.id+"");
                   }
               }
               this.state.rootSubmenuKeys.push(data[i].id+"");
           }
       }
       // 刷新菜单更新默认状态
       const { pathname } = this.props.history.location;
       const rank = pathname.split('/')
       switch (rank.length) {
         case 2 :  //一级目录
           this.setState({
             selectedKeys: [pathname]
           })
           break;
         case 5 : //三级目录,要展开两个subMenu
           this.setState({
             selectedKeys: [pathname],            
           })
           break;
         default :
           this.setState({
             selectedKeys: [pathname],
           })
       }
     
       // 浏览器前进后退按钮更新菜单状态
       if (window.history && window.history.pushState) {
           window.onpopstate = function () {
               window.location.reload(true); //刷新页面
           };
       }
   }
   handleSelectkeys(e){
       if(this.state.isShow){
           this.setState({
               selectedKey:e.key,
               openKeys:e.keyPath[length] == 3  ? [e.keyPath[2],e.keyPath[1]] : [e.keyPath[0]],
               isShow:true
            });
       }      
   }
   onOpenChange = (openKeys) => {
       const latestOpenKey = openKeys.find(key => this.state.openKeys.indexOf(key) === -1);
       let openList;
       if(this.state.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
           if(latestOpenKey&&latestOpenKey.length===3){
               openList = this.state.openKeys.filter((e)=>{
                   return e.length!==3;
               })
               this.setState({
                   openKeys:openList                });
           }else{
               this.setState({
                   openKeys:openKeys                });
           }          
       }else{
           if(latestOpenKey&&latestOpenKey.length===3){
               openList = this.state.openKeys.filter((e)=>{
                   return e.length!==3;
               })
               openList.push(latestOpenKey);
               this.setState({
                   openKeys:openList[1] ? openList : [openList[0],openList[2]]
               });
           }else{
               this.setState({
                   openKeys: latestOpenKey ? [latestOpenKey] : [],
               });
           }            
       }
   }
   render(){
       const data = this.props.list;
       var html = [];
       for(var i=0;i<data.length;i++){
           if(data[i].children){
               var li = []
               for(var j=0;j<data[i].children.length;j++){
                   var liData = data[i].children[j];
                   if(liData.children){
                       var oli = [];
                       for(var k=0;k<liData.children.length;k++){
                           oli.push(
                               <Menu.Item key={liData.children[k].url}>
                                   <Link to={
                                       {
                                           pathname:liData.children[k].url,
                                           state:{//三级菜单下传openKeys传两个值,展开两级
                                               parent:this.state.openKeys[0],
                                               child:this.state.openKeys[1]
                                           }
                                       }
                                   }>
                                       <span>{liData.children[k].text}</span>
                                   </Link>
                               </Menu.Item>
                           )
                       }
                       var oul = <SubMenu key={liData.id} title={<span>{liData.iconCls && <Icon type={liData.iconCls} />}<span>{liData.text}</span></span>}>{oli}</SubMenu>;
                       li.push(oul);
                   }else{
                       li.push(
                           <Menu.Item key={liData.url}>
                               <Link to={
                                   {
                                       pathname:liData.url,
                                       state:{//二级菜单下openKeys传一个值,展开一级
                                           parent:this.state.openKeys[0],
                                           // child:this.state.openKeys[1] ? this.state.openKeys[1] : ''
                                       }
                                   }
                                   
                                   } >
                                   {liData.iconCls && <Icon type={liData.iconCls} />}
                                   <span>{liData.text}</span>
                               </Link>
                           </Menu.Item>
                       );
                   }
               }
               var ul = <SubMenu key={data[i].id} title={<span>{data[i].iconCls && <Icon type={data[i].iconCls} />}<span>{data[i].text}</span></span>}>{li}</SubMenu>;
               html.push(ul);
           }else{
               html.push(
                   <Menu.Item key={data[i].url}>
                       <Link to={                          
                           {
                               pathname:data[i].url,
                               state:{//一级菜单下传空值,不展开菜单栏
                                   parent:''
                               }
                           }
                           } >
                           {data[i].iconCls && <Icon type={data[i].iconCls} />}
                           <span>{data[i].text}</span>
                       </Link>
                   </Menu.Item>
               )
           }
       }
       return (
           <Menu
               openKeys={this.state.openKeys}
               selectedKeys={[this.props.history.location.pathname]}
               onClick={this.handleSelectkeys}
               onOpenChange={this.onOpenChange}
               mode="inline"
               theme="dark"
               collapsed={this.state.collapsed}>
               {html}
           </Menu>
       )
   }}export default withRouter(Menus);

侧边栏数据 menu.js

const list = [
 {
     "id":1,
     "text":"检查清单",
     "state":"closed",
     "iconCls":"home",
     "children":[
         {
             "id":100,
             "text":"按月检查",
             "checked":false,
             "state":"closed",
             "iconCls":"",
             "url":"/platfORM/check/month"
         },
         {
             "id":101,
             "text":"按年检查",
             "checked":false,
             "state":"closed",
             "iconCls":"",
             "url":"/platform/check/year"
         }
     ]  
 },
 {
     "id":2,
     "text":"数据预览导出",
     "iconCls":"laptop",
     "state":"closed",
     "checked":true,
     "children":[
         {
             "id":200,
             "text":"做的书",
             "iconCls":"",
             "state":"closed",
             "checked":true,
             "children":[
                 {
                     "id":20001,
                     "text":"2018做的书",
                     "iconCls":" ",
                     "url":"/platform/export/makeBook/2018"
                 },
                 {
                     "id":20002,
                     "text":"2019做的书",
                     "iconCls":" ",
                     "url":"/platform/export/makeBook/2019"
                 },
                 {
                     "id":20003,
                     "text":"2020做的书",
                     "iconCls":" ",
                     "url":"/platform/export/makeBook/2020"
                 }
             ]
         },
         {
             "id":201,
             "text":"财务收入",
             "iconCls":"",
             "state":"closed",
             "checked":true,
             "children":[
                 {
                     "id":20101,
                     "text":"2018财务收入",
                     "iconCls":" ",
                     "url":"/platform/export/GMV/2018"
                 },
                 {
                     "id":20102,
                     "text":"2019财务收入",
                     "iconCls":" ",
                     "url":"/platform/export/GMV/2019"
                 },
                 {
                     "id":20103,
                     "text":"2020财务收入",
                     "iconCls":" ",
                     "url":"/platform/export/GMV/2020"
                 },
             ]
         },
         {
             "id":202,
             "text":"财务支出",
             "iconCls":"",
             "state":"closed",
             "checked":true,
             "children":[
                 {
                     "id":20201,
                     "text":"2018财务支出",
                     "iconCls":" ",
                     "url":"/platform/export/expend/2018"
                 },
                 {
                     "id":20202,
                     "text":"2019财务支出",
                     "iconCls":" ",
                     "url":"/platform/export/expend/2019"
                 },
                 {
                     "id":20203,
                     "text":"2020财务支出",
                     "iconCls":" ",
                     "url":"/platform/export/expend/2020"
                 },
             ]
         },
        ]
 },
]class SiderNav extends React.Component {
 render() {
   return (  
     <Sider  width={230}  breakpoint  className="AdminSider">
         <Menus list={list} />
     </Sider>
   )
 }}```

感谢各位的阅读,以上就是“react如何实现三级菜单”的内容了,经过本文的学习后,相信大家对react如何实现三级菜单这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: react如何实现三级菜单

本文链接: https://www.lsjlt.com/news/348709.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • react如何实现三级菜单
    这篇文章主要讲解了“react如何实现三级菜单”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现三级菜单”吧!react实现三级菜单的方法:1、创建展开三级父级菜单的方法为“o...
    99+
    2023-07-05
  • React四级菜单的实现
    效果图 JS import { Fragment, useState } from 'react'; import styles from './style.less'; cons...
    99+
    2024-04-02
  • Python下三级菜单实现
    今天学了一个三级菜单,甚是开心!!! 1.流程图 2.代码如下: #!/usr/bin/env python #name bearcatfly university_list = { # 大学列表 "安...
    99+
    2023-01-31
    菜单 Python
  • React四级菜单怎么实现
    本文小编为大家详细介绍“React四级菜单怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“React四级菜单怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果图JSimport {&nb...
    99+
    2023-06-29
  • 如何用CSS实现三级导航菜单
    这篇文章主要讲解了“如何用CSS实现三级导航菜单”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用CSS实现三级导航菜单”吧!这是一款CSS导航菜单,三级...
    99+
    2024-04-02
  • python 字典实现三级菜单
    简介:1.用字典建立一个省市县的三级菜单    2.开始显示所有的省份,输入要进入的省份之后,显示该省份下的所有市,输入市显示该市下的所有县    3.在每一级菜单下都可以返回到上一层菜单    4.随时可以退出 1 menu =...
    99+
    2023-01-30
    字典 菜单 python
  • vue递归实现三级菜单
    本文实例为大家分享了vue递归实现三级菜单的具体代码,供大家参考,具体内容如下 父组件 <template> <div class="menu-leve...
    99+
    2024-04-02
  • react如何实现浮动菜单
    本篇内容介绍了“react如何实现浮动菜单”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!react实现浮动菜单的方法:1、利用onMouse...
    99+
    2023-07-04
  • React实现antdM的级联菜单实例
    目录效果图需求分析bodyhead项目结构实现body部分实现head部分整合head与body效果图 需求分析 级联菜单分为两部分:head与body。 body 包含两部分:已...
    99+
    2024-04-02
  • js+css实现三级导航菜单
    本文实例为大家分享了js+css实现三级导航菜单的具体代码,供大家参考,具体内容如下 导航菜单hover事件用css实现相对容易,只需要将透明度更改即可,如果想要菜单有一个渐变的效果...
    99+
    2024-04-02
  • JavaScript+node实现三级联动菜单
    本文实例为大家分享了JavaScript+node实现三级联动菜单的具体代码,供大家参考,具体内容如下 项目分析 1、效果 2、前端 =>面向对象 =>首先分析下拉结构...
    99+
    2024-04-02
  • ajax如何实现三级联动下拉菜单效果
    这篇文章给大家分享的是有关ajax如何实现三级联动下拉菜单效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ajax写三级联动,先写一个文件类吧,以后用的时候直接调用即可;来找一...
    99+
    2024-04-02
  • python 三级菜单
    三级菜单:打印省、市、县三级菜单。可返回上一级,可随时退出程序首先准备基础数据zone = {     '山东' : {   ...
    99+
    2023-01-30
    菜单 python
  • 实现一个三级菜单小功能
    记录下一下 1 #!/usr/bin/env python3 2 ''' 3 需求:三级菜单 4 三级菜单,依次进入子菜单 5 ''' 6 City = { 7 '北京':{ 8 ...
    99+
    2023-01-30
    菜单 功能
  • vue实现三级联动动态菜单
    本文实例为大家分享了vue实现三级联动动态菜单的具体代码,供大家参考,具体内容如下 三级联动动态菜单展示:一级菜单选中,生成二级菜单数据,二级菜单选中,生成三级菜单数据(根据上一级菜...
    99+
    2024-04-02
  • 如何实现jQuery级联菜单
    这篇文章主要为大家展示了“如何实现jQuery级联菜单”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现jQuery级联菜单”这篇文章吧。具体内容如下层叠样...
    99+
    2024-04-02
  • CSS如何实现多级菜单
    这篇文章主要为大家展示了“CSS如何实现多级菜单”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS如何实现多级菜单”这篇文章吧。   这是一个相当炫的功能,...
    99+
    2024-04-02
  • 纯css如何实现二级菜单
    这篇“纯css如何实现二级菜单”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“纯css如何实现二级菜单”文章吧。HTML结构设...
    99+
    2023-07-05
  • 怎么使用JS实现三级联动菜单
    这篇“怎么使用JS实现三级联动菜单”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用J...
    99+
    2024-04-02
  • css如何实现动态二级菜单
    这篇文章将为大家详细讲解有关css如何实现动态二级菜单,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。动态实现简单的二级菜单当鼠标放到一级标签上时,鼠标会变成小手的形状 展示二级菜单,源码如下,复制即可直接...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作