【发布时间】:2019-08-04 09:06:04
【问题描述】:
我将 Vue.js 与 Vuex 模块一起使用。在几乎每个模块中,我都有一个名为 updateProp 的动作和突变,如下所示:
updateProp ({commit}, payload) {
commit('updateProp', payload)
}
updateProp (state, payload) {
state[payload.propName] = payload.newVal
}
所以当我在 Vuex 中定义一些具有源的计算属性时,我会写:
myComputedValue: {
get () {
return this.$store.state.vuexModuleName.propertyName
},
set (newValue) {
this.$store.dispatch('vuexModuleName/updateProp', {propName: 'propertyName', newVal: newValue})
}
}
我经常需要像这样定义多个计算值,所以我想我会创建一个全局辅助方法:
Vue.prototype.$computedDefHelper = (computedPropModel, computedPropName) => {
return {
get () {
return this.$store.state[computedPropModel][computedPropName]
},
set (newVal) {
this.$store.dispatch(`${computedPropModel}/updateProp`, {propName: computedPropName, newVal: newVal})
}
}
}
所以我将能够以更短的方式定义这些计算值:
myComputedValue: this.$computedDefHelper('vuexModuleName', 'propertyName')
但这不起作用 - 我收到一个错误,$computedDefHelper 不是一个函数 - 尝试了各种事情,比如像混合/插件/非箭头函数等使用它,但似乎没有任何工作 - 它甚至可能吗?
任何提示将不胜感激。
编辑:
我目前管理它的唯一方法是将其定义为帮助程序并将其导入我想使用的每个模块中:
import { computedDefHelper } from '@/helpers/globalHelpers'
所以我可以用它来定义计算值:
myComputedValue: computedDefHelper('vuexModuleName', 'propertyName')
但我想避免导入它,并且已经在每个组件中(全局)内置了它。
编辑 2:
我认为这可能与触发/生命周期 Vue.js 东西的顺序有关,因为如果我在 created 钩子中控制台记录此方法,它看起来不错,所以可能与这些计算方法对象定义在某种程度上有关在注册这个全局方法之前解析?
编辑 3:
我已经快速创建了一个更简单的版本,我想在代码沙箱中实现(不工作):https://codesandbox.io/s/x3661n317o
【问题讨论】:
-
使用 mapGetters 怎么样? vuex.vuejs.org/guide/getters.html
-
@MatheusValenza
mapGetters只会得到值。我也想设置。 -
@lukaszkups 而
mapActions呢? -
@MatheusValenza 我知道你会问:) 将
mapGetters(或mapState)与mapActions混合并不能真正缩短我的时间——我想这样使用它真的是单线;)
标签: javascript vue.js vuejs2 vuex