【问题标题】:Why do not you update the store data correctly after a dispatch from Vue Router?为什么在 Vue Router 调度后不正确更新 store 数据?
【发布时间】:2019-06-03 02:06:07
【问题描述】:

我在 vue-router 中保护了一些路由,这是通过 vue-router 中路由的元属性来实现的。

当我加载索引路由时,即所有记录都向我显示编辑按钮,因为那时我拥有此权限,如果我更新该用户,我会使用管理员用户转到另一个面板并删除所述权限.现在我转到普通用户并在我的表格的编辑按钮中给出,我应该将我发送到路线 403,因为我当时没有该权限,但它没有,只是到下一个导航到另一条路线我更新了权限。我该如何解决?

router.beforeEach((to, from, next) => {
    store.dispatch('ME'); // get permissions before navigate route
    if (to.matched.some(record => record.meta.permission_name)) {
        // I check if the route permits, otherwise send to route 403
        if(!store.getters.containsPermission(to.meta.permission_name)){
            next({name : '403'})
        }
        else{
            next()
        }
    }
    else{
        next()
    }
})

权限位于后端的数据库中,我使用 Laravel 和 Laravel 权限,通过从另一个管理员用户修改该用户的权限,并执行 store.dispatch('ME'); 我获得了新权限,我认为通过调用在评估元数据之前调度,它将正确到达next({'403'});

希望你理解我,如果不理解,请不要犹豫。

【问题讨论】:

  • 您的问题标题似乎与实际问题不符。如果您可以使其更合适,您将获得更好的响应
  • 您要么需要不断检查更新的用户权限,要么以某种方式将它们推送到您的应用程序(websockets 等)。当您说“如果我更新该用户” 时,这是什么意思?数据存储在哪里?
  • @Phil 我试图更好地关注标题,但问题是否得到理解?是否假设如果我在验证目标之前获得更新的权限,它会起作用吗?

标签: vue.js vuex vue-router


【解决方案1】:

不要在您的商店中设置权限。我,或者像我这样狡猾的人,可以随时为您的应用程序插入完全权限。相反,在每次路由更改之前使用 API 查询它们。

router.beforeEach(async (to, from, next) => {
  try {
    await api.get('permissions', { params: permissions: to.matched.some((record) => record.meta.permission_name }})

    next()
  } catch (e) {
    next({ name: '403 })
  }
})

只需在服务器端处理它。

【讨论】:

  • 这将用于路由,但我也使用权限来控制组件的元素。它是一个全球性的解决方案还是如何集中? ,所以修改store,从后端增加每个请求的权限验证。
  • 我会说组件级交互无关紧要,只有当路由更改并与您的 API 交互时。因此,事实上,您可以为 UX 驱动的方法引用存储以获取这些权限,但之后在服务器端接收 API 请求时始终验证权限。
  • 使用我的后端 API 的所有迭代都由策略和权限控制。在 UI 层面,你能做的最多就是让一项更可见,而不是获取数据。
  • 那么我会说给商店补水是正确的方法。但始终重新获取每个请求并比较 来自请求响应not 来自 store 在路由级别。
  • 我更新了商店,这就是我所做的,现在我尝试使用调度更新,但商店似乎更新到下一个请求。这是我的疑问,我不知道如何解决,因为我的行为不正确。
猜你喜欢
  • 2018-05-30
  • 2017-03-06
  • 2021-08-21
  • 2017-12-20
  • 2013-05-17
  • 2019-03-07
  • 1970-01-01
  • 2017-01-23
  • 2020-05-09
相关资源
最近更新 更多