将集合复制出 vuex 状态以防止突变是标准的吗?

Is it standard to copy collections out of vuex state to prevent mutation?

我搜索了 vue 论坛,有很多答案都是 2 年前的,而且很接近,但我很难找到一个专门解决这个问题的答案(我正在简化示例):

  1. 我有一组处于状态的对象(table 的行数据)
  2. 还有一个带有子组件的 table组件,它循环遍历数据并为集合中的每个项目创建一行
  3. 要求是在绑定到 rowData.foo
  4. 的 table 中的每一行添加一个输入
  5. tableComponent 有一个计算的 属性,它从状态中获取 rowData,将这些对象放入一个新的(修改过的)数组中,并将其传递到 tableComponent 模板中
  6. 然后用 rowData.foo
  7. 的 v 模型添加输入
  8. 这行得通,但我最近意识到它正在修改集合中 rowData 项的 foo 属性 而没有提交突变。

我同意删除 v-model 并使用@input 来提交更改,但我有两个关于它应该如何工作的问题

如果我想在点击“确认更改”按钮之前阻止这些更改,是否标准/高性能 _.cloneDeep tableComponent computed 属性 或 vuex getter 中的整个集合。看起来开销很大,但也许我对此过于保守?

允许 v-model 直接更新 RowData.foo 意味着每一行都知道要修改哪个 RowData 项,现在我正在提交对 vuex 集合中单个对象的更改,这是最佳实践vuex 突变 _.find 对象,改变它,然后将整个集合传播回商店?

与我的大多数其他 vue 问题一样,我有多种方法可以让它发挥作用,但我不确定最 performant/best 模式是什么。感谢您的帮助!

更新 简单的 codeSandbox 在这里:https://codesandbox.io/embed/vuex-store-olrvk 查看如何在没有操作调用的情况下更新 vuex 数据?

如果您需要缓冲用户对反应模型的更改(对于提交操作),您将需要进行深度复制。没有其他办法了。完全正常。

在查看了您的 codeSandbox 示例后,我发现是的,您的商店状态数据 rowCollection 正在发生突变,但没有使用任何突变,这是因为检测到的 v-model(two-way 绑定)内存中的数据点并在幕后对其进行变异......当然这是 Vue 开发人员允许的,即使我很难在任何文档中找到它(顺便说一下,他们在文档中展示了一个状态变异的例子使用 v-model 但他们为此使用了存储突变 )

关于 what is the most performant/best pattern 我认为这种方式最简单也更简洁(代码更少)