vue3开发“茅塞顿开”的两行代码

94 阅读2分钟

背景: 在部门内率先使用vue3+vite的框架进行搭建开发,需求是根据不同的用户角色添加不同的路由,就是同一个url不同角色的用户看到的系统菜单栏是不同的。

解决思路:

  1. 通过ajax异步获取当前用户的角色

  2. 根据用户角色动态添加路由

任务分配: 目标对象:工作3年的前端程序员

该同事解决思路: 在main.ts里,调用ajax获取当前用户的角色信息,响应后将用户角色信息保存到pina里,最后在router里获取pina的数据,动态创建vue-router。

// ajax异步获取角色信息
userRole()
.then(res => {
  const { resultData } = res // 角色信息
  userStore.role = resultData
})
.catch(err => {
  ElMessage.error('判断登录人权限失败,请刷新')
})
// 动态配置路由
const routes1 = [...] // 路由1,(这里只做示例,忽略代码正确性)
const routes2 = [...] // 路由2

const role = userStoreData.role
  const router = createRouter({
    history: createWebHashHistory(),
    routes: role ? routes1 : routes2
  })

该同事的关键问题是,没有对同步和异步有深入的理解。 代码初始化阶段,路由的引入是在main.ts的头部,因此会先执行route的实例化,此时pina里还没有数据。

解决方案:

搞清楚原因后,就开始着手修改:

  1. 如何让在异步之后才确定具体的路由配置,vue-router提供了addRoute。那么可以先实例化一个空路由的route实例。
  2. 页面的菜单栏,我们是自动化地从路由路提取出来的。那么,需要解决确定路由后才显示页面内容。解决思路可以在App.vue里ajax请求用户角色,然后动态添加路由;其实,还有一个更简单的办法并且在main.ts里就能够实现,就是moute()挂载。
userRole()
  .then(res => {
    const { resultData } = res 
    userStoreData.isNotAdmin = parseInt(resultData)
    router.addRoute(route) // ajax之后才去配置route的路由
    app.use(router) // ajax之后才将router挂载到vue实例
    app.mount('#app') // ajax之后才挂载html,解决页面显示菜单栏的问题
    })
  .catch(err => {
    ElMessage.error('判断登录人权限失败,请刷新')
  })
const router = createRouter({
  history: createWebHashHistory(),
  routes: [] // 创建空路由的router实例对象
})

总结:

  1. 解决问题的api:mount() addRoute()
  2. 前端开发需要对异步和同步要深入理解
  3. 在理解的基础上编写代码,关键时候能够解决较难的问题,比如mount,日常一般不会对框架的代码做改动。理解了,关键时候能提供很大帮助。

最后:该同事的回复:

image.png

最后,并且将我的解决思路分享给了其他同事,看来遇到这个问题的不在少数。因此将该思路分享出来~~ 虽然简单,但知识需要积累后才能薄发!!!