antd5 -Menu 组件

2,617 阅读4分钟

API解读:

1. Menu 组件属性:

  • mode:菜单的展示方式,可选值为 "horizontal"、"vertical"、"inline",默认为 "vertical"。

  • theme:菜单的主题,可选值为 "light"、"dark",默认为 "light"。

  • selectedKeys:当前选中的菜单项 key 值。

  • defaultSelectedKeys:默认选中的菜单项 key 值。

  • openKeys:当前展开的菜单项 key 值。

  • defaultOpenKeys:默认展开的菜单项 key 值。

  • inlineCollapsed:是否收起内嵌菜单。

  1. Menu.Item 组件属性:

  • key:菜单项的唯一标识。

  • disabled:是否禁用菜单项。

  • icon:菜单项的图标。

  1. Menu.SubMenu 组件属性:

  • key:子菜单的唯一标识。

  • title:子菜单的标题。

  • disabled:是否禁用子菜单。

  • icon:子菜单的图标。

  1. Menu 组件方法:

  • onClick:点击菜单项时触发的回调函数。

  • onOpenChange:展开/关闭子菜单时触发的回调函数。

  1. Menu 组件的功能:

  • 支持多级菜单和子菜单。
  • 支持水平和垂直两种展示方式。
  • 支持内嵌菜单。
  • 支持自定义菜单项和子菜单的样式和图标。
  • 支持点击菜单项和子菜单时触发回调函数。
  • 支持展开和关闭子菜单时触发回调函数。
  • 支持通过 selectedKeys 和 openKeys 控制菜单项的选中和展开状态。

其下的所有子组件

Ant Design 的 Menu 组件包含以下组件:

  1. Menu:导航菜单的容器组件,支持水平和垂直两种方式的展示,可以包含多个 Menu.Item 和 Menu.SubMenu 组件。

  2. Menu.Item:导航菜单项组件,用于展示一个菜单项,可以设置图标和禁用状态。

  3. Menu.SubMenu:导航子菜单组件,用于展示一个子菜单,可以包含多个 Menu.Item 和 Menu.SubMenu 组件,支持多级子菜单。

  4. Menu.Divider:导航菜单分割线组件,用于在菜单中添加分割线。

  5. Menu.ItemGroup:导航菜单分组组件,用于将多个 Menu.Item 组合在一起,可以设置分组标题。

  6. Menu.SubMenu.SubMenu:导航子菜单的子菜单组件,用于在子菜单中添加多级子菜单。

以上组件是 Ant Design 的 Menu 组件中最主要的组件,可以根据需求进行组合和配置,实现不同的导航菜单效果。

1.水平顶部导航栏

代码及解释如下:

import { AppstoreOutlined, SettingOutlined } from '@ant-design/icons';
import { Menu } from 'antd';
import { useState } from 'react';
import { NavLink } from 'react-router-dom';

//首先我们写数据
const items=[
    {
    label:(<NavLink to='/table'>表格</NavLink>)
    //导航文本内容带有路由跳转功能
    key:'mail'
    //导航唯一表示,不可缺
    },
     {
        label: '禁用标题',
        key: 'app',
        icon: <AppstoreOutlined />,
        disabled: true,
        //此导航是否可用
    },
     {
        label: '子菜单选项',
        key: 'subme',
        icon: <SettingOutlined />,
        //子菜单配置项
        children: [
            {
                type: 'group',
                // 子菜单项的类型,可以是 "group" 或 "item"
                //group展开样式 item 不展开样式
                 label: 'Item 3',
                children: [
                //子菜单下的菜单配置
                    {
                        label: 'Option 3',
                        key: 'setting:1',
                    },
                    {
                        label: 'Option 4',
                        key: 'setting:2',
                    },
                ],
            },
            
            {
                type: 'group',
                label: 'Item 2',
                children: [
                    {
                        label: 'Option 3',
                        key: 'setting:3',
                    },
                    {
                        label: 'Option 4',
                        key: 'setting:4',
                    },
                ],
            },
        ],
    },
     {
        label: (
            <a href="https://ant.design" target="_blank" rel="noopener noreferrer">
              带有超链接的导航
              //使用路由更好一些
            </a>
        ),
        key: 'alipay',
    },
]

//menu 渲染

const App()=()=>{
    const [current,setCurret]=useState('mail')
    //创建状态 下面在导航选中需要key所以我们需要先写一个初始值
    const clickMenu=(e)=>{
        setCurret(e.key)
    }
    //创建点击时修改选中事件 解读就是点击哪一行选中哪一行的key 就给curret 然后渲染到 menu中
        return(
        <>
            <Menu onClick={clickMenu} selectedKeys={[current]} mode="vertical"items={items} style={{ width: 200 }} />
            
            //解读:onClick 点击时调用, `selectedKeys` 属性,使得选中的菜单项呈现选中状态。 
            mode 为导航是垂直还是水平 items为渲染内容,style为样式
        </>
        )
}

效果如下:

1678521411196.png

2.垂直内嵌式导航

讲一下官网的实现原理: 写个函数传入属性然后我们调用函数写入值然后渲染即可

陌生API:

  • defaultSelectedKeys: 默认选中的菜单项的 key 值,可以是一个字符串或者字符串数组。
  • defaultOpenKeys: 默认展开的子菜单的 key 值,可以是一个字符串或者字符串数组。
  • mode: 菜单的模式,可以是 inlinehorizontal 或者 vertical,分别表示内嵌菜单、水平菜单和垂直菜单。默认值是 vertical

下列代码中,defaultSelectedKeys 的值是 ['1'],表示默认选中第一个菜单项;defaultOpenKeys 的值是 ['sub1'],表示默认展开第一个导航菜单项的子菜单;mode 的值是 inline,表示使用内嵌菜单模式。

这些属性可以根据需要进行修改,以满足不同的需求。例如,如果想要默认展开多个子菜单,可以将 defaultOpenKeys 的值设置为一个字符串数组,包含多个子菜单的 key 值。

代码如下:


import { MailOutlined, SettingOutlined } from '@ant-design/icons';
import { Menu } from 'antd';
function getItem(label, key, icon, children, type) {
  return {
    key,
    icon,
    children,
    label,
    type,
  };
}
const items = [
  getItem('Navigation One', 'sub1', <MailOutlined />, [
    getItem('Item 1', 'g1', null, [getItem('Option 1', '1'), getItem('Option 2', '2')], 'group'),
    getItem('Item 2', 'g2', null, [getItem('Option 3', '3'), getItem('Option 4', '4')], 'group'),
  ]),
  getItem('Navigation Two', 'sub2', null, [
    getItem('Option 5', '5'),
    getItem('Option 6', '6'),
    getItem('Submenu', 'sub3', null, [getItem('Option 7', '7'), getItem('Option 8', '8')]),
  ]),
  {
    type: 'divider',
  },
  getItem('Navigation Three', 'sub4', <SettingOutlined />, [
    getItem('Option 9', '9'),
    getItem('Option 10', '10'),
    getItem('Option 11', '11'),
    getItem('Option 12', '12'),
  ]),
  getItem('Group', 'grp', null, [getItem('Option 13', '13'), getItem('Option 14', '14')], 'group'),
];
const App = () => {
  const onClick = (e) => {
    console.log('click ', e);
  };
  return (
    <Menu
      onClick={onClick}
      style={{
        width: 256,
      }}
      defaultSelectedKeys={['1']}
      defaultOpenKeys={['sub1']}
      
      //展开的导航
      mode="inline"
      items={items}
      them='dark'
      //主题颜色定制浅色是light 深色是dark
    />
  );
};
export default App;

效果官网所示,不在展示

3.合并所有父导航:

原理不写:只写代码:


 const rootSubmenuKeys = ['sub1', 'sub2','sub3', 'sub4'];
 //创建合并的父导航key的数组值
  const [openKeys, setOpenKeys] = useState(['sub1']);
  const onOpenChange = (keys) => {
    const latestOpenKey = keys.find((key) => openKeys.indexOf(key) === -1);
    if (rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
      setOpenKeys(keys);
    } else {
      setOpenKeys(latestOpenKey ? [latestOpenKey] : []);
    }
  };

导航部分讲解完毕!