14.1 识别是否运行于发状态运行

下面是app.tsx的第一行代码,它展示了判断当前是否运行于开发状态的方法:

  1. const isDev = process.env.NODE_ENV === 'development';

这种识别方法可以在其它页面使用。

14.2 应用初始化及全局共享的数据

接下来一个比较重要的部分是getInitialState函数(我们给自动生成的代码加上了注释):

  1. /**
  2. * @see https://umijs.org/zh-CN/plugins/plugin-initial-state
  3. * */
  4. export async function getInitialState(): Promise<{
  5. settings?: Partial<LayoutSettings>;
  6. currentUser?: API.CurrentUser;
  7. fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
  8. //如果要返回更多的内容,可以补充在这里,最好不要定义成any,以增加可维护性
  9. }> {
  10. const fetchUserInfo = async () => {
  11. try {
  12. //queryCurrentUser的默认逻辑是直接向后端请求用户数据,
  13. //由后端判断当前用户的登录状态
  14. //可以改成前端先根据Token或Cookie判断是否需要登录
  15. const currentUser = await queryCurrentUser();
  16. return currentUser;
  17. } catch (error) {
  18. //这里出现异常一般是没有登录或者因超时需要重新登录
  19. history.push(loginPath);
  20. }
  21. return undefined;
  22. };
  23. // 如果不是登录页面,那么额外返回当前用户的信息
  24. if (history.location.pathname !== loginPath) {
  25. const currentUser = await fetchUserInfo();
  26. return {
  27. fetchUserInfo,
  28. currentUser,
  29. settings: {},
  30. };
  31. }
  32. //如果是登录页面,那么就只需要返回下面两项
  33. return {
  34. fetchUserInfo,
  35. settings: {},
  36. };
  37. }

这个getInitialState函数会在整个应用系统最开始被自动调用执行,它的返回值会成为全局共享的数据。Layout 插件、Access 插件以及用户都可以通过 useModel('@@initialState')直接获取到这份数据。如果想要重新执行 getInitialState 方法并获取新数据,或者手动设置 initialState 的值,也需要用useModel来实现,具体见官方文档

脚手架初始化的时候getInitialState中完成的工作是获取当前用户信息,返回获取用户的函数、当前用户信息以及布局的设置LayoutSettings(详见代码中的注释)。实际与具体应用相关的初始化操作和全局共享数据都应该在这个函数中执行并返回。

更详细的说明参见https://umijs.org/zh-CN/plugins/plugin-initial-state

14.3 全局异常处理程序

app.tsx的第二个重要部分是全局异常处理程序。这部分的细节已经在上一章讨论过,这里不再赘述。

14.4 页面布局的运行时配置

app.tsx的第三个重要部分是页面布局的运行时配置(Rung-Time Page Layout Configuration),它通过export const layout = ({}) 来完成。

  1. // ProLayout 支持的api https://procomponents.ant.design/components/layout
  2. // 同时可以参考UmiJS的文档 https://umijs.org/zh-CN/plugins/plugin-layout
  3. export const layout: RunTimeLayoutConfig = ({ initialState }) => {
  4. return {
  5. //在src/components/RightContent中实现
  6. rightContentRender: () => <RightContent />,
  7. disableContentMargin: false,
  8. //默认用当前用户的名字做水印
  9. waterMarkProps: {
  10. content: initialState?.currentUser?.name,
  11. },
  12. //在src/components/Footer中实现
  13. footerRender: () => <Footer />,
  14. onPageChange: () => {
  15. const { location } = history;
  16. // 如果没有登录,重定向到 login
  17. if (!initialState?.currentUser && location.pathname !== loginPath) {
  18. history.push(loginPath);
  19. }
  20. },
  21. //在以开发状态运行的时候,在左侧最下显示两个和文档有关的链接
  22. //关于Open API的链接应该在第0章的时候被删除
  23. links: isDev
  24. ? [
  25. <Link to="/~docs">
  26. <BookOutlined />
  27. <span>业务组件文档</span>
  28. </Link>,
  29. ]
  30. : [],
  31. menuHeaderRender: undefined,
  32. // 自定义 403 页面
  33. // unAccessible: <div>unAccessible</div>,
  34. ...initialState?.settings,
  35. };
  36. };

此外,主题等与dom无关的配置都可以在文件config/config.ts 中配置。

更详细的内容参见下面两个链接

更详细的内容见https://umijs.org/zh-CN/plugins/plugin-request

版权说明:本文由北京朗思云网科技股份有限公司原创,向互联网开放全部内容但保留所有权力。