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

React 动态菜单-不限级递归菜单树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;//菜单数据结构typeMenuData={id:number,name:.


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159442.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RestSharp_简单搜索怎么使用

    RestSharp_简单搜索怎么使用C#使用restsharp调用接口

    2022年9月4日
  • LAMP配置点滴[通俗易懂]

    LAMP配置点滴[通俗易懂]第一次配编译安装LAMP足足弄了两天,各种折腾。参考http://www.lamphowto.com/,其他的可以看源码的README,或官方文档其中让浏览器自动提示语法错误的方法是改php.ini:装好后打开网页:localhost/index.html居然显示:TherequestedURL/index.htmlwasnotfoundon

    2022年5月10日
  • pd.notnull

    pd.notnull

    2022年6月10日
  • c++string截取字符串

    c++string截取字符串C++的string类提供了大量的字符串操作函数,提取字符串的一部分,可采用substr函数实现:头文件:#include<string>//注意没有.hstring.h是C的标准字符串函数数,c++中一般起名为ctring.而string头文件是C++的字符串头文件。函数原型:stringsubstr(intpos=0,intn)const;函数说明:参数1:pos是必填参数参数2:n是可参数,表示取多少个字符,不填表示截取到末尾该函数功能为:返回从

    2022年5月12日
  • AS2 笔记 1——attachMovie 添加库影片

    AS2 笔记 1——attachMovie 添加库影片this["container"].attachMovie("useLoad","useLoadMc",this.getNextHigh

    2022年7月2日
  • Java生成XML格式

    Java生成XML格式工具:dom4j-1.6.1.jar相关类importorg.dom4j.Attribute;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.DocumentHelper;importorg.dom4j.Element;importorg.dom4j.io.SAXRe…

    2022年7月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号