【发布时间】:2018-06-22 20:18:55
【问题描述】:
我正在协调输入元素与 Vuex 状态下对象的键。假设我有这个对象:
myObj: { foo: 1, bar: 2 }
以及组件中的计算属性:
myObjVals: {
get(){ return this.$store.state.myObj },
set(//?) { //? },
},
在模板中,我可以从商店获取值:
<input type="number" v-model="myObjVals['foo']"/> // displays "1"
<input type="number" v-model="myObjVals['bar']"/> // displays "2"
但是当我调整输入的值时,我收到错误:“不要在突变处理程序之外改变 vuex 存储状态。”
这里一个明显的解决方案是为 myObj... 中的 each 键设置不同的计算属性...但是对于较大的对象,这会变得重复/繁琐。我想知道是否有任何方法可以像我在上面尝试的那样对此进行编码,即仅使用一个计算属性来引用v-model 中get 和set 函数的对象。
【问题讨论】:
-
我不认为这是可能的,因为 VueJS 无法知道它应该使用对象的 setter 而不是直接改变它从状态中获得的对象。一种方法是使用 Vuex 的
mapState来帮助生成所需的 getter (vuex.vuejs.org/guide/state.html#the-mapstate-helper)。编辑:当然你也可以使用 vuex 的非严格模式 -
啊哈 - 这是一种传递引用错误,不是吗?
-
将查看
mapState,谢谢。 -
是的。您正在获取整个对象,并且通过访问模型中的不同属性,您可以在不使用 setter 的情况下更改对象。至少我相信是这样的。您是否尝试过使用 setter 并从那里为对象调用 Vuex 突变?
-
那是我不确定的。如果您对 whole 对象执行计算属性,然后更改
v-model内的属性值,是否还会调用 setter。我会假设 settter 甚至没有被调用。而且我也相信你不能写一个基于键的自定义设置器。
标签: javascript vue.js