将集合复制出 vuex 状态以防止突变是标准的吗?
Is it standard to copy collections out of vuex state to prevent mutation?
我搜索了 vue 论坛,有很多答案都是 2 年前的,而且很接近,但我很难找到一个专门解决这个问题的答案(我正在简化示例):
- 我有一组处于状态的对象(table 的行数据)
- 还有一个带有子组件的 table组件,它循环遍历数据并为集合中的每个项目创建一行
- 要求是在绑定到 rowData.foo
的 table 中的每一行添加一个输入
- tableComponent 有一个计算的 属性,它从状态中获取 rowData,将这些对象放入一个新的(修改过的)数组中,并将其传递到 tableComponent 模板中
- 然后用 rowData.foo
的 v 模型添加输入
- 这行得通,但我最近意识到它正在修改集合中 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
我认为这种方式最简单也更简洁(代码更少)
我搜索了 vue 论坛,有很多答案都是 2 年前的,而且很接近,但我很难找到一个专门解决这个问题的答案(我正在简化示例):
- 我有一组处于状态的对象(table 的行数据)
- 还有一个带有子组件的 table组件,它循环遍历数据并为集合中的每个项目创建一行
- 要求是在绑定到 rowData.foo 的 table 中的每一行添加一个输入
- tableComponent 有一个计算的 属性,它从状态中获取 rowData,将这些对象放入一个新的(修改过的)数组中,并将其传递到 tableComponent 模板中
- 然后用 rowData.foo 的 v 模型添加输入
- 这行得通,但我最近意识到它正在修改集合中 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
我认为这种方式最简单也更简洁(代码更少)