antd pro4-(3)从服务器请求菜单

参考官网 路由和菜单

antd pro中默认菜单根据路由配置,匹配登录用户的权限进行生成。
路由节点需要配置authority属性来辅助生成菜单,如:

{
	path: '/admin',
    name: 'admin',
    icon: 'crown',
    component: './Admin',
    authority: ['admin'],
},

考虑到需要比较灵活的配置权限角色,避免增加或修改角色权限后需要更改前端,
所以通过后端返回各用户的菜单。

路由中不写死权限的话,假如用户没有admin权限,使用/admin也可以访问到不在菜单中的页面,但获取业务数据等请求本身后端也会校验权限返回错误,前端处理异常后会跳转到403页面,不知道是不是有更好的方法。

从服务器请求菜单,官网中是这么说明的:

你可以在 src/layouts/BasicLayout.tsx 中修改 menuDataRender,并在代码中发起 http 请求,只需服务器返回下面格式的 json 即可
注意: path 必须要在 config.ts 中定义。(约定式路由不需要,只需页面真实有效即可)
注意: 如果没有选用 typescript,config.js 中菜单的嵌套写法,需要把 “children” 换成 “routes”

[
  {
    "path": "/dashboard",
    "name": "dashboard",
    "icon": "dashboard",
    "children": [
      {
        "path": "/dashboard/analysis",
        "name": "analysis"
      },
      {
        "path": "/dashboard/monitor",
        "name": "monitor"
      },
      {
        "path": "/dashboard/workplace",
        "name": "workplace"
      }
    ]
  }
  // ....
]

冲冲冲…
先写个mock方便测试~~mock/menu.js:

export default {
  'GET /api/currentMenu': [
    {
      path: '/welcome',
      name: 'welcome',
      icon: 'smile',
    },
    {
      path: '/admin',
      name: 'admin',
      icon: 'crown',
    },
    {
      path: '/list',
      name: 'list.table-list',
      icon: 'table',
    },
  ],
}

继续写个model来发起请求和变更state~~models/userMenu.js:

import {queryCurrentMenu} from "@/services/user";

const UserMenuModel = {
  namespace: 'userMenu',
  state: {
    currentMenu: [],
  },
  effects: {
    //代表事件的Action对象,由于函数体不需要Action内容,所有使用`_`占位符代替Action对象了
    //const { call, put } = sagaEffects
    //也可以yield call(request, url), 这里统一放到services
    *fetchCurrentMenu(_, { call, put }) {
      const response = yield call(queryCurrentMenu);
      yield put({
        type: 'saveCurrentMenu',
        payload: response,
      });
    },
  },
  reducers: {
    saveCurrentMenu(state, action) {
      return { ...state, currentMenu: action.payload || [] };
    },
  },
}
export default UserMenuModel;

在service加点代码~~services/user.js:

export async function queryCurrentMenu() {
  return request('/api/currentMenu');
}

接下来就是调整下BasicLayout了:

调整一下connect 的mapStateToProps, 使从model中注入props

export default connect(({ global, settings, userMenu }) => ({
  collapsed: global.collapsed,
  settings,
  menuData: userMenu.currentMenu,
}))(BasicLayout);

用useEffect发送Action,因为BasicLayout是属于函数组件非类组件,没有生命周期函数如componentDidMount()等;
从props取出menuData;
变更menuDataRender;
实现如下:

const BasicLayout = props => {
  const {
    ...
    menuData,
  } = props;
  /**
   * constructor
   */
  useEffect(() => {
    if (dispatch) {
      dispatch({
        type: 'userMenu/fetchCurrentMenu',
      });
    }
  }, []);
  ...
  render(
  	...
  	menuDataRender={() => menuData}
  	...
  )
};

运行瞅瞅
菜单正常显示了,图标没显示出来!
Console这样提示

为了兼容 antd@4,我们会在下个版本删除配置 icon: string 生成icon的用法。请查看
https://pro.ant.design/blog/antd-4.0-cn 寻找解决方式!

查看后是这么说的:

但是 Pro 中支持通过设置 icon 配置菜单图标,在 4.0 中将无法得到支持,所以我们提供了相应的插件来保留此功能。
使用方式如下 :
yarn add umi-plugin-antd-icon-config -D
并且在 config.ts 中设置

export default {
  plugins: [['umi-plugin-antd-icon-config', {}]],
};

我使用的是npm,相当于

npm install umi-plugin-antd-icon-config --save-dev

添加依赖会更新 package.json
–dev 依赖会记录在 package.json 的 devDependencies 下

然后,,图标还是没出来。。
怀疑是不是环境问题,依赖的包版本哪里不对可能。先这样吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: antd-mobile-vue是一个基于Vue.js框架的移动端组件库,它提供了一系列UI组件,用于开发高质量的移动端应用。 与其它UI组件库相比,antd-mobile-vue具有以下优势和特点: 1. 高质量的组件:antd-mobile-vue提供了丰富的移动端UI组件,如按钮、表单、弹窗、导航等,这些组件都经过了精心设计和开发,具有统一的风格和良好的用户体验。 2. 灵活的布局:antd-mobile-vue提供了灵活的布局组件,如栅格布局、Flex布局,可帮助开发者快速搭建页面结构,并自适应不同的屏幕尺寸。 3. 易于使用和扩展:antd-mobile-vue的组件使用简单,开发者可以通过简单的配置和参数就可以实现复杂的交互效果。而且,antd-mobile-vue的组件提供了丰富的扩展能力,可以根据项目需求进行个性化的定制。 4. 生态丰富:antd-mobile-vue拥有庞大的开发者社区和活跃的维护团队,开发者可以通过官方文档和社区资源获取帮助和支持。此外,antd-mobile-vue还与其它Vue.js生态工具和库良好地兼容,如Vue Router、Vue CLI等。 5. 支持国际化:antd-mobile-vue提供了多语言支持,开发者可以根据项目需求灵活地切换多种语言环境。 总之,antd-mobile-vue是一个功能强大、易于使用和扩展的移动端组件库,它可以帮助开发者快速构建高质量的移动端应用,提高开发效率和用户体验。 ### 回答2: antd-mobile-vue是一种基于Vue.js框架的移动端UI库。它是对Ant Design Mobile的Vue组件实现的封装和扩展,旨在为开发者提供高质量、易用性的移动端组件库,帮助快速开发移动应用程序。 antd-mobile-vue提供了丰富的移动端UI组件,如按钮、导航栏、标签栏、列表、表单等,可以满足日常开发中绝大部分的界面需求。这些组件都经过精心设计和优化,在视觉和交互上都符合当前移动端的设计原则和用户体验。而且,它还提供了灵活的定制和扩展能力,允许开发者根据具体需求进行个性化定制,提高开发效率和用户体验。 除了UI组件外,antd-mobile-vue还提供了一些实用的工具和功能,如样式工具库、语言国际化、路由管理等。这些工具和功能都是为了让开发者更方便地进行移动应用开发,减少重复性的工作,提高开发效率。 antd-mobile-vue拥有广泛的社区支持和文档资料,开发者可以从社区中获取帮助和解决问题,学习和掌握使用该库的技巧和最佳实践。同时,antd-mobile-vue还提供了详细的官方文档和示例代码,方便开发者快速入手和上手该库。 总之,antd-mobile-vue是一款功能强大、易用性强的移动端UI库,适用于各种移动应用的开发。无论是个人开发者还是团队开发,都可以通过使用antd-mobile-vue来快速构建高质量的移动应用程序。 ### 回答3: antd-mobile-vue 是一个基于 Vue.js 的移动端 UI 组件库,它提供了丰富的移动端组件和样式风格,可以帮助开发者快速构建优雅的移动端应用。 antd-mobile-vue 的特点有以下几个方面: 1. 高度可定制:antd-mobile-vue 提供了大量的组件,涵盖了移动端常见的UI元素,如按钮、导航栏、表单等,这些组件的样式和交互行为都可以通过配置进行定制,满足不同项目的需求。 2. 兼容性强:antd-mobile-vue 提供了对不同移动端浏览器和操作系统的支持,保证组件在不同环境下的正常运行和展示,同时也保证了用户的使用体验。 3. 特色设计:antd-mobile-vue 的设计风格简洁、现代,符合移动端用户的审美要求,同时也遵循了 Material Design 和 iOS Human Interface Guidelines 等设计准则,保证了用户的熟悉感和易用性。 4. 文档丰富:antd-mobile-vue 提供了详细的文档和示例代码,开发者可以根据文档了解组件的使用方法和配置参数,快速上手使用。 5. 生态丰富:antd-mobile-vue 是基于 Ant Design Mobile(antd-mobile)的 Vue 实现,可以与其它 Vue 生态工具和插件无缝集成,如 Vue Router、Vuex 等,方便开发者构建复杂的移动应用。 总之,antd-mobile-vue 是一个强大而灵活的移动端 UI 组件库,它可以帮助开发者节省时间和精力,快速开发出高质量的移动应用。无论是个人项目还是企业应用,都可以考虑使用这个库来提升开发效率和用户体验。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值