antd中Menu 导航菜单怎么异步加载
时间: 2024-11-16 21:19:59 浏览: 13
在Ant Design (antd) 中,Menu 导航菜单可以实现异步加载主要是通过结合`menu-item`的`async`属性以及`onSelect`回调函数。当你需要在用户点击某个菜单项时动态加载数据,你可以这样做:
1. 首先,给需要异步加载的菜单项设置`async`属性为`true`。
```jsx
import { Menu, Menu.Item } from 'antd';
// 假设我们有一个获取路由数据的函数
const fetchData = async (routeKey) => {
// 这里是一个模拟的异步请求
const data = await new Promise((resolve) => setTimeout(resolve, 500)); // 模拟500毫秒延迟的数据返回
return data;
};
const menuItems = [
{
key: 'item1',
label: 'Item 1',
children: [
{
key: 'subItem1',
...fetchData('subItem1'), // 使用 `async` 属性并传递一个获取数据的函数
// 或者你可以直接传入一个Promise,如 fetchData('subItem1').then(data => ({ key: 'subItem1', ...data }))
// 当数据准备好时,它会被渲染为子菜单
},
],
},
// 其他同步或异步加载的菜单项...
];
```
2. 然后,在`onSelect`事件处理函数中,你需要处理实际的数据加载,并更新状态或触发渲染。
```jsx
<Menu selectedKeys={['item1']} defaultSelectedKeys={['item1']} onSelectedKeys={(keys) => console.log(keys)}>
{menuItems.map(item => (
<Menu.Item key={item.key} {...item}>
{/* 如果item是一个Promise,可以用async/await处理 */}
{item.isPromise ? item.then(data => <Menu.SubMenu title={data.label}>{data.children}</Menu.SubMenu>) : null}
</Menu.Item>
))}
</Menu>
// 当用户选择异步菜单项时,可以在onSelect中处理数据加载结果
const menu = ref(null);
React.useEffect(() => {
menu.current.onSelect(async (e) => {
const data = await fetchData(e.key);
if (data) {
// 更新menuItems,替换当前选中的子菜单
const updatedItems = menuItems.map(i => i === e.item ? { ...i, ...data } : i);
setMenuItems(updatedItems); // 或者其他更新数据结构的方式
}
});
}, [menuItems]);
```
阅读全文