首页 > 其他分享 >React 动态菜单-不限级递归菜单树

React 动态菜单-不限级递归菜单树

时间:2023-06-05 14:32:18浏览次数:35  
标签:不限级 菜单 const string React item import children


import {FC, useState} from "react";
import {Layout, Menu} from 'antd';
import {Link} from 'react-router-dom'
import {getData} from "../../mock-data";

const {Header, Content, Footer, Sider} = Layout;

//菜单数据结构
type  MenuData = {
    id: number,
    name: string;
    link: string;
    children: MenuData[];
};

const Home: FC = (props) => {
    const [openKeys, setOpenKeys] = useState<string[]>([]);
    // setOpenKeys(props.openKeys)

    //定义方法:菜单无限级递归
    function tree(data: { id: string | number; name: string; link: string; children: any }[]) {
        return data.map((item) => {
            if (item.children === undefined) {
                return (<Menu.Item key={item.id}><Link
                    to={{pathname: item.link, state: {openKeys: openKeys}}}>{item.name}</Link></Menu.Item>)
            } else {
                return (
                    <Menu.SubMenu key={item.id} title={item.name}>
                        {tree(item.children)}
                    </Menu.SubMenu>
                )
            }
        })
    }

    //获取数据并绑定到类型上
    let menuData: MenuData[] = getData() as MenuData[];
    //动态菜单列表
    const elements = tree(menuData);

    return (
        <div>
            <Layout>
                <Sider style={{width: '100vw', height: '100vh'}}>
                    <Menu theme='dark' mode='inline' onOpenChange={keys => {
                        const keys1 = keys as string[];
                        setOpenKeys(keys1)
                    }}>
                        <div style={{height: "32px", margin: "16px", background: "rgba(255, 255, 255, 0.3)"}}/>
                        {elements}
                    </Menu>
                </Sider>
                <Layout>
                    <Header>Header</Header>
                    <Content>
                        {props.children}
                    </Content>
                    <Footer>Footer</Footer>
                </Layout>
            </Layout>
        </div>
    );
}
export default Home;

标签:不限级,菜单,const,string,React,item,import,children
From: https://blog.51cto.com/u_14121041/6415452

相关文章

  • pyqt5笔记-菜单与工具栏
    目录主窗口状态栏动作组合菜单栏子菜单勾选菜单右键菜单工具栏关闭当前窗口和结束应用程序主窗口QMainWindow就是主窗口,QMainWindow提供了更多的特性,如菜单栏、工具栏、状态栏和停靠窗口等,它是为复杂的主窗口应用设计的。QMainWindow继承自QWidget,所以QMainWindow不仅可以......
  • 导航和菜单的教程一
    jQuery制作多级导航菜单([color=red][b]说的很详细[/b][/color])[url]http://www.w3cplus.com/jquery/how-to-build-and-enhance-more-level-navigation-menu[/url][color=red][b]先了解css选择器[/b][/color]:[url]http://www.ruanyifeng.com/blog/2009/03......
  • 导航和菜单的教程二
    jQuery实现多级下拉菜单导航([color=red][b]说的很详细[/b][/color])[url]http://www.yaohaixiao.com/frontend/javascript-dom-programming-tutorial-how-to-achieve-multi-level-drop-down-menu/[/url][color=red][b]最好看原文,原文排版比较好[/b][/col......
  • 4 个多才多艺的 jQuery 下拉菜单插件
    [url]http://www.php100.com/html/webkaifa/javascript/2012/0607/10512.html[/url]这里我们收集了4个最棒的jQuery下拉菜单插件,提供很多特性,例如自动完成、搜索、标签、多选、ajax等。1.ddSlickddSlick是一个轻量级的jQuery插件用来实现定制的下......
  • jQuery实现多级手风琴菜单
    手风琴菜单一般用于下拉导航,由于外观非常简洁,使用起来跟手风琴一样可以拉伸和收缩而得名,项目中适当应用手风琴效果会给用户带来非常好的体验。本文借助jQuery插件轻松打造一个非常不错的手风琴效果的菜单。[img]http://www.helloweba.com/attachments/fck/multi_menu.gif[/img]De......
  • vscode插件开发----在编辑栏上增加菜单项
    在package.json做如下配置:"contributes":{"commands":[{"command":"codeStat.countCurFile","title":"统计当前文件"}],"menus":{"editor/t......
  • react中reduce基本使用
    importReact,{useReducer}from'react';import'./App.css';constApp=()=>{constreduce=(state,action)=>{constactionFn={add:function(){return{...state,count:state.count+1}......
  • Flex/AS3/flash player支持屏蔽右键菜单,自定义菜单,并设置相应的菜单事件(示例,图解)..
    播放器版本11.2以后支持右键菜单屏蔽及自定义菜单1.更新播放器,11.2以上版本http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_3.swchttp://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_4.swchttp://download.macro......
  • 【React工作记录八十六】React+Hook+ts+antDesignMobile实现input自动获取功能
    前言大家好我是歌谣今天继续处理工作遇到的问题目前要做的问题是移动端需要做一个进入页面获取焦点的功能实现演示核心代码input上面绑定refs<InputonChange={handleChange}ref={inputRef}placeholder="请输入条形编码或者扫码录入"/>定义状态constinputRef:any=useRef(nul......
  • 【由浅到深】聊聊 Vue 和 React 的区别,看看你在哪个段位
    大家好,我是沐华。最近部门招人,捞了一批简历至少都是5年以上的前端来面试,其中不乏360的,腾讯的,简历上写的基本都是熟练使用Vue2、Vue3、React并阅读源码对其实现原理有自己的理解,实际问起来却不免让人唏嘘比如:既然两个框架都用过,那能说一下你觉得这俩有什么区别吗毕竟是两个框架,不......