1.打开src/app.jsx,我们之前在app.jsx中做了用户信息的全局初始化,即在getInitialState方法中调用后台接口获取用户数据,并return出去,getInitialState()方法返回的数据最后会被默认注入到一个 namespace 为 @@initialState 的 model 中。可以通过 useModel 这个 hook 来消费它,我们把全局初始数据章节中用来消费getInitialState()方法中返回的数据示例代码再过一下,加深理解
import React from 'react';
import { useModel } from 'umi';
import { Spin } from 'antd';
export default () => {
const { initialState, loading, refresh, setInitialState } = useModel('@@initialState');
if (loading) {
return <Spin />;
}
return <div>{initialState.userName}</div>;
};
在任何组件中我们可以用useModel(‘@@initialState’)拿getInitialState()中return的数据,
上面的示例取出了initialState.userName
const { initialState, loading, refresh, setInitialState } = useModel('@@initialState');
2.菜单数据的处理跟用户信息的处理类似,我们先导入service文件中的getCurrentUserMenus方法
import { getCurrentUserMenus } from './services/ant-design-pro/menu';
3.在getInitialState() 中fetchUserInfo函数后面,定义获取菜单数据的函数fetchUserMenus,代码如下
const fetchUserMenus = async () => {
try {
const menuData = await getCurrentUserMenus();
return menuData;
} catch (error) {
history.push(loginPath);
}
return undefined;
};
fetchUserMenus就是调用getCurrentUserMenus()拿到转换好的菜单数据,并return 出去。
4.跟fetchUserInfo一样,把fetchUserMenus一样return 出去,必须是登录成功获取到token以后,才能获取菜单信息,增加一个本地token的判断,修改完毕后,完整的getInitialState代码如下
export async function getInitialState() {
const fetchUserInfo = async () => {
try {
const msg = await queryCurrentUser();
return msg.user;
} catch (error) {
history.push(loginPath);
}
return undefined;
};
const fetchUserMenus = async () => {
try {
const menuData = await getCurrentUserMenus();
return menuData;
} catch (error) {
history.push(loginPath);
}
return undefined;
};
if (history.location.pathname !== loginPath) {
const token = localStorage.getItem('access_token');
if (!token) {
history.push(loginPath);
return {
fetchUserInfo,
fetchUserMenus,
menuData: [],
settings: {},
};
}
const currentUser = await fetchUserInfo();
const menuData = await fetchUserMenus();
return {
fetchUserInfo,
fetchUserMenus,
currentUser,
menuData,
settings: {},
};
}
return {
fetchUserInfo,
fetchUserMenus,
menuData: [],
settings: {},
};
}
5.然后在src/app.jsx中的layout中我们就可以直接使用menuData的数据
export const layout = ({ initialState }) => {
...initialState?.settings,
}
在…initialState?.settings,前加一行代码,
menuDataRender: () =>{ return initialState?.menuData },登录以后,就可以看到菜单数据了
export const layout = ({ initialState }) => {
menuDataRender: () =>{
return initialState?.menuData
},
...initialState?.settings,
}
6.登录后,原来的config/config.js中的菜单不会出现了,数据库中的菜单树会展现出来,如下图所示:
7.这里有个菜单的图标问题,我们拿到的菜单图标显示的都是字符串,没有正常显示图标,这里我们在下一节进行完善