vue.js - 如何在定义全局访问属性时使 vuex DRY?

标签 vue.js vuejs2 vuex

我在 $store 中有一些通用状态,例如 errorsession,我希望将其作为计算属性 error 进行访问所有组件(包括路由器中的组件)中的 >session。我知道我应该这样做:

var store = new Vuex.Store({
  state: {
    error: undefined,
    session: JSON.parse(localStorage.getItem('session')),
  },
  mutations: {
    error: function(state, error) {
      state.error = error
    },
    session: function(state, session) {
      state.session = session
    },
  },
})

var loginView = new Vue({
  computed: {
    error: {
      get () {
        return this.$store.state.error
      },
      set (val) {
        this.$store.commit('error', val)
      }
    },
    session: {
      get () {
        return this.$store.state.session
      },
      set (val) {
        this.$store.commit('session', val)
      }
    },
  },
})

var router = new VueRouter({
  routes: [
    {
      path:'/login', 
      component: loginView,
    },
  ],
})

var app = new Vue({
  store,
  router,
  computed: {
    error: {
      get () {
        return this.$store.state.error
      },
      set (val) {
        this.$store.commit('error', val)
      }
    },
    session: {
      get () {
        return this.$store.state.session
      },
      set (val) {
        this.$store.commit('session', val)
      }
    },
  },
})

如您所见,它不是干的。如果路由器中有 100 个组件,并且我希望它们能够具有这样的计算属性,该怎么办?有什么办法可以解决这个问题吗?也许类似于 Vuex 中的选项 globals:

var store = new Vuex.Store({
  globals: ['error', 'session'], // this will enable all components' computed property of error and session
  state: {
    error: undefined,
    session: JSON.parse(localStorage.getItem('session')),
  },
  mutations: {
    error: function(state, error) {
      state.error = error
    },
    session: function(state, session) {
      state.session = session
    },
  },
})

var loginView = new Vue({
  computed: {
  },
})

var router = new VueRouter({
  routes: [
    {
      path:'/login', 
      component: loginView,
    },
  ],
})

var app = new Vue({
  store,
  router,
  computed: {
  },
})

最佳答案

我在文档中没有看到 Vuex 支持计算值的 set 。如果确实如此,您可能最好使用 mapGetters

如果你想遵循 Vuex 的精神,我认为最好的方法是 利用mapGetters和mapActions/mapMutations并将您的映射到操作/突变。

您还可以使用mixin去做这个。我知道您说过您想在全局范围内定义这些值(您可以使用全局 mixin 来实现),但您可以通过定义具有这些属性的 mixin 来保持 DRY 并将其应用到您实际需要的地方 .

最后你可以使用 global mixin 。请注意链接文档中使用全局 mixin 的注意事项。

Vue.mixin({
  computed: {
    error: {
      get () {
        return this.$store.state.error
      },
      set (val) {
        this.$store.commit('error', val)
      }
    },
    session: {
      get () {
        return this.$store.state.session
      },
      set (val) {
        this.$store.commit('session', val)
      }
    },
  }
})

error 是一个非常通用的名称,如果它是每个组件的属性,您可能需要重新考虑它。

关于vue.js - 如何在定义全局访问属性时使 vuex DRY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023774/

相关文章:

typescript - 使用 Vuex mapGetters 时如何修复 TypeScript 错误?

docker - VueCLI3 应用程序 (nginx/docker) 使用环境特定变量

Laravel/Vue.js 问题

html - vue中鼠标悬停时如何突出显示并获取html元素的元素

javascript - 如何使用 Vue.js 将图像 url 绑定(bind)到 Framework7 list-item "media"属性?

javascript - 双嵌套动态模块注册-vuex

vue.js - Vue js 在作用域插槽中选择带有 v-model 的元素

javascript - 如果组件中有 getter,如何更改 v-overlay 的值?

javascript - 使用 Vue 的搜索框和复选框过滤器

vuex - "vue js dev tools"测试版如何记录突变和 Action ?