Javascript Vue+;vuex对象突变

Javascript Vue+;vuex对象突变,javascript,vue.js,vuex,Javascript,Vue.js,Vuex,我有一个国家: state: { objects: [ { id: 10, key2: 'smth', key3: 'smth' //etc... }, { id: 12', key2: 'smth', key3: 'smth' //etc... } ] } 我按id选择一个,然后通过v-model更改其关键点 吸气剂 activeObject: s

我有一个国家:

state: {
  objects: [ 
    { 
      id: 10,
      key2: 'smth',
      key3: 'smth'
      //etc...
    },
    { 
      id: 12',
      key2: 'smth',
      key3: 'smth'
      //etc...
    }
  ]
}
我按id选择一个,然后通过v-model更改其关键点

吸气剂

  activeObject: state => {
    return state.objects.find((obj) => obj.id === state.objId)
  }
在vue模板中

  computed: {
    obj() {
      return this.$store.getters.activeObject
    }
  },
在html中

<input v-model="obj.key2"></input>

问题是vuex告诉我,我只需要改变突变。 我看到了很多解决方案,比如computed:get()set(),或者只克隆或更改一个键。但我能做些什么来用id重写整个对象呢? 我的数组中的对象可能有很多键,因此将更新提交func写入每个键将非常痛苦

有没有一种解决方案可以用一次提交重写具有多个键的对象

请不要告诉我使用lodash或其他LBI,只使用普通的vue/js

有没有一种解决方案可以用一次提交重写具有多个键的对象

当然有:

myMutation(state, { id, newItem }) {
    const item = state.objects.find(item => item.id === id);
    Object.assign(item, newItem);
}

//...
const params = { id: 23, newItem: myNewItem };
store.commit('myMutation', params);
请注意,Vue不会观察阵列内部的更改。它不会对它们作出反应


添加源代码示例后编辑

您所做的是反对Vuex的“单向数据流”概念。Vuex中详细说明了如何处理您的用例:

假设obj是从存储返回对象的计算属性,这里的v-model将尝试在用户输入时直接改变obj.message。在严格模式下,这将导致错误,因为变异不是在显式Vuex变异处理程序中执行的。处理它的“Vuex方法”是绑定的值,并对输入或更改事件调用操作

因此,使用事件处理程序

updateObj(e){
这是.store.commit('updateObj',e.target.value);
}

从HTML代码中通过



请注意,如前所述,Vue是否能够看到您对存储的
对象
s/
数组
s所做的更改取决于您如何定义它们以及如何访问它们,请参见。

是否要对对象进行变异或创建具有新值的新副本(不可变)?我正在按id拾取对象,然后使用getters,我在我的组件中使用它,并用v-model更改它的键,所以是的,我想在objects中重写这个拾取的对象
我按id拾取一个对象,然后通过v-model更改它的键。
您能提供更多信息或代码片段来显示您的方法吗?我应该在哪里执行store.commit?事实上,它确实观察到了,因为我所做的工作是有效的,但是只有在使用
commit
的情况下才会抛出错误进行变异,这完全取决于您的上下文-但是给定了新的代码示例,如上所示:可能在
input
事件中。Vue是否会看到您的更改是Vue和Vuex文档中解释的一个复杂主题,请参阅链接。