使用 vuex v-model 指定对象值

Gre*_*ett 3 javascript vue.js

我正在协调输入元素与 Vuex 状态的对象的键。假设我有这个对象:

myObj: { foo: 1, bar: 2 }
Run Code Online (Sandbox Code Playgroud)

以及组件中的计算属性:

myObjVals: {
  get(){ return this.$store.state.myObj },
  set(//?) { //? },
},
Run Code Online (Sandbox Code Playgroud)

在模板中,我可以商店获取值:

<input type="number" v-model="myObjVals['foo']"/>  // displays "1"
<input type="number" v-model="myObjVals['bar']"/>  // displays "2"
Run Code Online (Sandbox Code Playgroud)

但是当我调整输入的值时,我收到错误消息:“不要在突变处理程序之外改变 vuex 存储状态。”

这里一个明显的解决方案是为... 中的每个键使用不同的计算属性,myObj但对于较大的对象,这会变得重复/繁琐。我想知道是否有任何方式的代码作为此我试图以上,即,仅使用一个计算的属性来引用对象两者getset功能v-model

pue*_*elo 5

再想想你的问题。一种解决方案可能是这里建议的东西:https : //vuex.vuejs.org/guide/forms.html

<input type="number" :value="myObjVals['foo']" @input="changeMyObj('foo', $event)"/>  // displays "1"
<input type="number" :value="myObjVals['bar']" @input="changeMyObj('bar', $event)"/>  // displays "2"
Run Code Online (Sandbox Code Playgroud)

具有计算属性和方法:

computed: {
    myObjVals: function () {
        return this.$store.state.myObj
    }
},
methods: {
    changeMyObj(key, evt) {
        this.$store.commit('changeMyObj', {key: key, value: evt.data})
    }
}
Run Code Online (Sandbox Code Playgroud)

在商店内发生突变:

mutations: {
  changeMyObj(state, objInput) {
    state.myObj[objInput.key] = objInput.value
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个“工作”小提琴:http : //jsfiddle.net/zfab6tzp/346/

不确定这是否是最好的解决方案,但它似乎有效