umi的routes文件中如何设置当一个菜单只要有多个子菜单权限中的一个权限就显示这个菜单
时间: 2024-02-16 17:03:56 浏览: 257
在 umi 的 routes 文件中,可以通过配合 dva 或者 redux 状态管理工具,以及 umi 的权限控制插件 @umijs/plugin-access 实现根据权限动态生成路由。以下是一种可能的实现方式:
1. 在 umi 的配置文件 config.js 中,配置 @umijs/plugin-access 插件:
```javascript
export default {
plugins: [
['@umijs/plugin-access', {
access: './src/access.ts', // 配置权限控制文件的路径
}],
],
}
```
2. 在 src/access.ts 文件中,定义菜单权限的判断逻辑。这里假设权限信息存储在 redux store 中:
```javascript
export default function access(initialState: any) {
const { user } = initialState;
return {
menuFilter: (menuData: any[]) =>
menuData.filter((menu) => {
if (!menu.authority) { // 如果菜单没有定义权限,则直接显示
return true;
}
if (Array.isArray(menu.authority)) { // 如果菜单定义了多个权限,只要有一个权限满足则显示
return menu.authority.some((auth) => user.authorities.includes(auth));
}
return user.authorities.includes(menu.authority); // 如果菜单只定义了一个权限,则必须满足该权限才显示
}),
};
}
```
3. 在菜单配置文件中,为每个菜单项添加 authority 属性,指定该菜单项需要的权限:
```javascript
export default [
{
path: '/dashboard',
name: 'Dashboard',
icon: 'dashboard',
// 定义多个权限
authority: ['admin', 'user'],
routes: [
{
path: '/dashboard/monitor',
name: 'Monitor',
component: './Dashboard/Monitor',
},
{
path: '/dashboard/analysis',
name: 'Analysis',
component: './Dashboard/Analysis',
},
],
},
{
path: '/list',
name: 'List',
icon: 'table',
// 只定义一个权限
authority: 'admin',
routes: [
{
path: '/list/search',
name: 'Search Table',
component: './List/TableList',
},
{
path: '/list/basic-list',
name: 'Basic List',
component: './List/BasicList',
},
],
},
];
```
4. 在菜单组件中,通过 connect 方法获取 redux store 中的用户信息,然后将菜单数据传入 @umijs/plugin-access 插件的 menuFilter 方法进行权限过滤:
```javascript
import { connect } from 'dva';
import { getMenuData } from '@umijs/route-utils';
import { useIntl } from 'umi';
import styles from './index.less';
const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
const { children, location, user } = props;
const { formatMessage } = useIntl();
const menuDataRef = useRef([]);
const menuData = useMemo(() => getMenuData(props.route.routes, menuDataRef.current), [
props.route.routes,
]);
const filteredMenuData = useAccess().menuFilter(menuData);
return (
<div className={styles.container}>
<Layout>
<SiderMenu
logo={logo}
title={formatMessage({ id: 'app.title' })}
menuData={filteredMenuData}
location={location}
collapsed={collapsed}
onCollapse={handleMenuCollapse}
/>
<Layout>
<Header
...
/>
<Content className={styles.content}>
...
</Content>
<Footer
...
/>
</Layout>
</Layout>
</div>
);
};
export default connect(({ user }: ConnectState) => ({
user,
}))(BasicLayout);
```
这样,当用户具有某个菜单项的其中一个权限时,该菜单项就会显示在菜单中。
阅读全文