Vue router - 如何根据用户角色在同一路由路径上加载多个组件?

2024-01-20

我有一个应用程序,用户可以以不同的角色登录,例如。seller, buyer and admin。 对于每个用户,我想在同一路径上显示仪表板页面,例如。http://localhost:8080/dashboard然而,每个用户将在不同的 vue 组件中定义不同的仪表板,例如。SellerDashboard, BuyerDashboard and AdminDashboard.

所以基本上,当用户打开时http://localhost:8080/dashboardvue 应用程序应该根据用户角色(我存储在 vuex 中)加载不同的组件。同样,我希望其他路线也能这样做。例如,当用户转到个人资料页面时http://localhost:8080/profile应用程序应根据登录用户显示不同的配置文件组件。

因此,我希望为所有用户角色使用相同的路由,而不是为每个用户角色使用不同的路由,例如。我不希望用户角色包含在 url 中,如下所示:http://localhost:8080/admin/profile and http://localhost:8080/seller/profile etc...

如何使用 vue router 来实现这个场景?

我尝试使用儿童路线和每路线警卫的组合beforeEnter根据用户角色解析路由。这是一个代码示例:

in 路由器.js:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import store from '@/store'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'home',
    component: Home,

    beforeEnter: (to, from, next) => {
      next({ name: store.state.userRole })
    },

    children: [
      {
        path: '',
        name: 'admin',
        component: () => import('@/components/Admin/AdminDashboard')
      },
      {
        path: '',
        name: 'seller',
        component: () => import('@/components/Seller/SellerDashboard')
      },
      {
        path: '',
        name: 'buyer',
        component: () => import('@/components/Buyer/BuyerDashboard')
      }
    ]
  },
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

in store.js:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    userRole: 'seller' // can also be 'buyer' or 'admin'
  }
})

App.vue包含顶级路由的父路由器视图,例如。地图/ to Home组件和/about to About成分:

<template>
  <router-view/>
</template>

<script>
export default {
  name: 'App',
}
</script>

And Home.vue包含嵌套router-view对于不同用户的基于角色的组件:

<template>
  <div class="home fill-height" style="background: #ddd;">
    <h1>Home.vue</h1>
    <!-- nested router-view where user specific component should be rendered -->
    <router-view style="background: #eee" />
  </div>
</template>

<script>
export default {
  name: 'home'
}
</script>

但这不起作用,因为我得到了Maximum call stack size exceeded当我调用时浏览器控制台出现异常next({ name: store.state.userRole }) in beforeEnter。例外情况是:

vue-router.esm.js?8c4f:2079 RangeError: Maximum call stack size exceeded
    at VueRouter.match (vue-router.esm.js?8c4f:2689)
    at HTML5History.transitionTo (vue-router.esm.js?8c4f:2033)
    at HTML5History.push (vue-router.esm.js?8c4f:2365)
    at eval (vue-router.esm.js?8c4f:2135)
    at beforeEnter (index.js?a18c:41)
    at iterator (vue-router.esm.js?8c4f:2120)
    at step (vue-router.esm.js?8c4f:1846)
    at runQueue (vue-router.esm.js?8c4f:1854)
    at HTML5History.confirmTransition (vue-router.esm.js?8c4f:2147)
    at HTML5History.transitionTo (vue-router.esm.js?8c4f:2034)

因此什么也没有呈现。

我有办法解决这个问题吗?


您可能想尝试围绕此解决方案进行一些操作:

<template>
  <component :is="compName">
</template>
data: () {
 return {
      role: 'seller' //insert role here - maybe on `created()` or wherever
 }
},
components: {
 seller: () => import('/components/seller'),
 admin: () => import('/components/admin'),
 buyer: () => import('/components/buyer'),
}

或者,如果您喜欢更简洁一点(相同的结果):

<template>
  <component :is="loadComp">
</template>
data: () => ({compName: 'seller'}),
computed: {
 loadComp () {
  const compName = this.compName
  return () => import(`/components/${compName}`)
 }
}

这将使您能够使用动态组件,而无需预先导入所有 cmps,而是每次只使用所需的组件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue router - 如何根据用户角色在同一路由路径上加载多个组件? 的相关文章

随机推荐

  • 从 hibernate 迁移到普通 jdbc

    我最近开始从事 Java 和 J2EE 工作 并且具备 JDBC 和 hibernate 相关概念的理论知识 我的工作任务是将现有的 Hibernate 连接转换为普通 JDBC 任何人都可以建议最简单的方法来做到这一点 实际上 我必须处理
  • 查询为给定事件类型注册的事件侦听器列表

    有没有一种方法可以识别 JavaScript 中给定事件的注册侦听器列表 如果可以 您可以列出示例吗 不是一般情况下 仅当您自己在代码中跟踪所有事件侦听器时才能执行此操作 最简单的方法是对所有事件侦听器分配使用包装函数 如果其中一个大型图书
  • Objective-C KVO 不适用于 C 联合

    我需要使用 KVO 观察 Objective C 类上的联合类型属性 但似乎我对此没有运气 我做了一些实验 只要我使用 C 结构 一切都会正常 一旦我用联合替换结构 自动 KVO 就不再工作了 observeValueForKeyPath没
  • 异步加载脚本

    我正在使用 JQuery 中的几个插件 自定义小部件和其他一些库 结果我有几个 js 和 css 文件 我需要为我的网站创建一个加载程序 因为加载需要一些时间 如果我可以在导入所有内容之前显示加载程序 那就太好了 etc 我找到了几个教程
  • 失败时漂亮打印数组

    describe Rspec do it should print arrays in a readable manner do arr 0 a 1 1 b 2 2 c 3 3 d 4 4 e 5 6 g 7 7 h 8 8 i 9 arr
  • 为什么Java编译器11使用invokevirtual来调用私有方法?

    当使用 OpenJDK 8 中的 Java 编译器编译以下代码时 调用foo 是通过一个完成的invokespecial 但是当使用 OpenJDK 11 时 invokevirtual被发射 public class Invoke pub
  • 两个java源文件的结构差异

    有没有办法找到两个java源文件的结构差异 我想找到两个java文件的结构差异 但我不知道如何开始 java中有没有用于此目的的库 更新 结构差异意味着像 它不关心空白或位置 它应该在语法上比较源 这有助于我们跟踪实际的更改 即使方法被移动
  • 安卓|使用 Retrofit2 和本地 API 进行基本身份验证

    我开始制作一个应用程序 并首先将其连接到模拟 API 现在我想将其连接到在我的 PC 上运行的 API For starters I m trying to implement the login access Since my API s
  • 在 JavaScript 中将 png/jpg 转换为 .ico

    所以我想要一个工具来生成 ico来自 jpg png 的文件 我使用以下代码从画布生成了 jpg var img c toDataURL image png document write img src 取自此画布
  • 如何更改 flutter showAboutDialog 中的文本按钮颜色?

    我正在使用showAboutDialogflutter 中的函数显示我的项目中使用的许可证 我如何坚持改变文本颜色VIEW LICENSES and CLOSE文本按钮 请参阅此图片以进行说明 这是我的代码 onTap showAboutD
  • 如何在离开和返回 HTTPS 页面时保留更改的表单内容? (适用于 HTTP)

    在文本区域中输入 更改某些内容 在提交表单之前 请离开页面 例如通过单击浏览器的后退按钮 返回编辑页面 例如 单击前进按钮 预期结果 在textarea中输入的内容应该仍然存在 实际结果 with HTTPS 所有的改变都消失了 bad w
  • MongoDB无尽查找ToListAsync

    我正在尝试从 MongoDB 集合中检索数据 但是发生了一些奇怪的事情 如果我显示 MessageBox 则数据获取有效 如果不显示 则数据获取无效 static class MongoDBController static MongoCl
  • Obj-C Cocoa 通知 NSApplicationDidResignActiveNotification

    我有一个名为 AppController h m 的类 我想在发送 NSNotificationDidResignActiveNotification 时做一些事情 所以我在AppController m中编写了这段代码 void init
  • CNN - 图像调整大小 VS 填充(是否保持纵横比?)

    虽然人们在训练 CNN 时通常倾向于简单地将任何图像调整为正方形 例如 resnet 采用 224x224 正方形图像 但这对我来说看起来很难看 尤其是当长宽比不在 1 左右时 事实上 这可能会改变基本事实 例如 专家可能给扭曲图像的标签可
  • 如何获得适用于 Android 的简单相机程序?

    我刚刚开始用 Java 编程 我需要一个简单的应用程序来显示相机 拍照并将图片数据发送到某个地方 我一直在网上搜索 试图找到一个按预期工作的好相机教程 但显然它们都需要一些我还没有的内在知识 On this https stackoverf
  • 如何对齐输入内部的文本?

    对于所有默认输入 您填写的文本从左侧开始 怎么让它从右边开始呢 Use the 文本对齐 http www w3schools com cssref pr text text align aspCSS 中的属性 input text ali
  • C++ 中的继承和模板 - 为什么继承的成员不可见?

    当一个模板公开继承另一个模板时 基公共方法不应该是可访问的吗 template
  • 如何在 php 中添加 txt 文件并创建 ZIP [重复]

    这个问题在这里已经有答案了 可能的重复 打开文件 写入文件 将文件另存为 zip 并流式传输给用户下载 https stackoverflow com questions 2286639 open file write to file sa
  • Xcode 7 GM 无法验证 git 存储库

    我可以使用 Xcode 6 毫无问题地提交到这个存储库 git 在终端中仍然可以正常工作 我可以在本地和远程提交 在 Xcode 7 中 我可以本地提交 但不能远程提交 它说身份验证失败并且无法重置用户名 它呈灰色 我的本地 git 配置文
  • Vue router - 如何根据用户角色在同一路由路径上加载多个组件?

    我有一个应用程序 用户可以以不同的角色登录 例如 seller buyer and admin 对于每个用户 我想在同一路径上显示仪表板页面 例如 http localhost 8080 dashboard然而 每个用户将在不同的 vue