美文网首页ant design pro V5 学习
ant design pro(ts) V5 问题1:动态获取路由

ant design pro(ts) V5 问题1:动态获取路由

作者: Xmaxdev | 来源:发表于2020-08-25 19:29 被阅读0次

    废话

    看了官网文档,起初真的很懵,抱着试试的态度用了一下

    直接上代码 还是用V4 的 menuDataRender方法
    接口是用的 yapi

    yapi接口管理工具
    /* src/services/API.d.ts */
    
    //TODO copy default
    
      export interface httpRule{
        success?: boolean,
        data?: any,
        errorCode?: number,
        errorMessage?: string,
        showType?: number,
        traceId?: string,
        host?: string
      }
    
    
    /* src/service/menu.ts */
    import { request } from 'umi';
    
      export async function getMenuList(userid:string) {
        return request<API.httpRule>('/srevice/api/getMenuList',{
            method:'POST',
            data:{userid}
        });
      }
    
    /* scr/app.tsx */
    import React from 'react';
    import { BasicLayoutProps, Settings as LayoutSettings,MenuDataItem } from '@ant-design/pro-layout';
    import { notification } from 'antd';
    import { history, RequestConfig } from 'umi';
    import RightContent from '@/components/RightContent';
    import Footer from '@/components/Footer';
    import { ResponseError } from 'umi-request';
    import { queryCurrent } from './services/user';
    import { getMenuList } from './services/menu';
    import defaultSettings from '../config/defaultSettings';
    import _ from 'lodash';
    
    
    export async function getInitialState(): Promise<{
      currentUser?: API.CurrentUser;
      settings?: LayoutSettings;
      menuList?:API.httpRule;
    }> {
      // 如果是登录页面,不执行
      if (history.location.pathname !== '/user/login') {
        try {
          const currentUser = await queryCurrent();
          //add:获取到当前用户,请求菜单
          const menuList = await getMenuList(currentUser.userid||'');
          return {
            currentUser,
            settings: defaultSettings,
            menuList
          };
        } catch (error) {
          history.push('/user/login');
        }
      }
      return {
        settings: defaultSettings,
        menuList:{}
      };
    }
    
    
    export const layout = ({
      initialState,
    }: {
      initialState: { settings?: LayoutSettings; currentUser?: API.CurrentUser, menuList?:API.httpRule;};
    }): BasicLayoutProps => {
        //add:使用lodash 判断路由是否空
        const {routes} = _.isEmpty(initialState?.menuList)?{routes:[]}:initialState?.menuList.data
      return {
        menuDataRender:()=>routes,
        rightContentRender: () => <RightContent />,
        disableContentMargin: false,
        footerRender: () => <Footer />,
        onPageChange: () => {
          // 如果没有登录,重定向到 login
          if (!initialState?.currentUser?.userid && history.location.pathname !== '/user/login') {
            history.push('/user/login');
          }
        },
        menuHeaderRender: undefined,
        ...initialState?.settings,
      };
    };
    
    const codeMessage = {
      200: '服务器成功返回请求的数据。',
      201: '新建或修改数据成功。',
      202: '一个请求已经进入后台排队(异步任务)。',
      204: '删除数据成功。',
      400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
      401: '用户没有权限(令牌、用户名、密码错误)。',
      403: '用户得到授权,但是访问是被禁止的。',
      404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
      405: '请求方法不被允许。',
      406: '请求的格式不可得。',
      410: '请求的资源被永久删除,且不会再得到的。',
      422: '当创建一个对象时,发生一个验证错误。',
      500: '服务器发生错误,请检查服务器。',
      502: '网关错误。',
      503: '服务不可用,服务器暂时过载或维护。',
      504: '网关超时。',
    };
    
    /**
     * 异常处理程序
     */
    const errorHandler = (error: ResponseError) => {
      const { response } = error;
      if (response && response.status) {
        const errorText = codeMessage[response.status] || response.statusText;
        const { status, url } = response;
    
        notification.error({
          message: `请求错误 ${status}: ${url}`,
          description: errorText,
        });
      }
    
      if (!response) {
        notification.error({
          description: '您的网络发生异常,无法连接服务器',
          message: '网络异常',
        });
      }
      throw error;
    };
    
    export const request: RequestConfig = {
      errorHandler,
    };
    
    结果

    相关文章

      网友评论

        本文标题:ant design pro(ts) V5 问题1:动态获取路由

        本文链接:https://www.haomeiwen.com/subject/lzgzjktx.html