开发者问题收集

在 VueJS 中添加用于有条件渲染组件的属性

2021-05-07
235

在我们的前端,我们希望根据用户是否具有触发操作的“权限”来禁用某些元素(即按钮)。为了保持代码整洁,我们想做这样的事情:

<button reqPermission="edit">

这应该调用连接到我们的权限服务的 JS 方法,并且 Vue 应该仅在请求为真时才呈现元素/启用它。

我对 VueJS 不太了解 - 但我想避免的是使用 v-if="..." 之类的东西,因为这会使我们的代码混乱。任何关于如何实现这种影响组件渲染的“自定义属性”的提示都将不胜感激。我目前发现的是 https://forum.vuejs.org/t/how-to-conditionally-render-a-component/69687/6

1个回答

如果要基于布尔值禁用它,可以在 Vue 模板语法中执行以下操作:

<button :disabled="!userRights.edit">

如果要防止渲染而不是禁用按钮,请使用 v-if 而不是 :disabled

如果必须从后端加载布尔值,我建议使用 vuex 存储操作来获取用户权限并根据商店状态进行条件渲染:

<template>
  <button :disabled="!isLoading && !userRights.edit">
</template>

<script>
import { mapState } from 'vuex'

export default {
  name: 'buttonComponent',
  computed: {
    ...mapState('userModule', ['isLoading', 'userRights']),
  },
  mounted() {
    this.$store.dispatch('userModule/getRights')
  },
}
</script>

export default {
  namespaced: true,
  state: {
    isLoading: false,
    userRights: {
      edit: false,
      view: false,
    },
  },
  mutations: {
    updateIsLoading(state, isLoading) {
      state.isLoading = isLoading
    },
    updateUserRights(state, userRights) {
      state.userRights = userRights
    },
  },
  actions: {
    async getRights() {
      this.commit('userModule/updateIsLoading', true)

      const user = await getCurrentUserID()
      const rights = await getRightsByUser(user) // backend call

      this.commit('userModule/updateUserRights', rights)
      this.commit('userModule/updateIsLoading', false)
    },
  },
}
leonheess
2021-05-07