我开始在新项目中使用Vuex,我真的很喜欢它。 但是我仍然不明白的是,我应该如何有效地管理数组元素的状态?
看看这个例子。
假设我打开页面,并从后端加载以下响应:
{
"reportName": "Parent name",
"groups": [
{
"id": 1,
"name": "child group name 1",
"elements": [
{
"id": 1,
"name": "sub-child el 1",
"enabled": false
},
...
]
},
...
]
}
该实体具有一系列子实体。每个子元素都有一个子子元素。
现在假设我有一个专用组件来显示每个级别:父实体,每个子(组)和子子元素。
子子组件中有一个复选框,该复选框绑定到enabled
字段。
使用Vuex,我不应该直接更改状态。
因此,当我按下复选框时,Vue使用变异编辑状态
在这里我看到两个问题:
我认为我缺少了一些东西,可以更有效地修改状态。
而且,子孩子也可能不必知道它属于哪个组。
我对可以做什么有一些想法:
我想让你知道我做错了什么,并指出 正确使用Vuex来管理阵列状态的正确方向
答案 0 :(得分:1)
一种简化变异逻辑的解决方案是标准化响应数据。这是使用软件包normalizr来实现此目的的示例:
import { normalize, schema } from "normalizr";
const elementEntity = new schema.Entity('elements');
const groupEntity = new schema.Entity('groups', {
elements: [elementEntity]
});
const reportEntity = new schema.Entity('reports', {
groups: [groupEntity]
});
const normalizeFunc = (reportData) => normalize(reportData, reportEntity);
可以在保存数据之前调用功能normalizeFunc
,如以下代码和框所示:https://codesandbox.io/s/vue-template-k6y51
通过标准化上述方式,它有助于:
Array.prototype.find
的O(N)到O(1)来搜索具有给定id的特定项目的时间。答案 1 :(得分:0)
您所质疑的全部与体系结构首选项有关。
您的解决方案可以工作,而且效果不佳。
我不建议您运用您的想法,它会给您带来比现在更多的问题和复杂性。传递一些道具并扫描数组并不昂贵。
尽管如此,解决此类问题的方法是以无状态模式转换所有子组件。
这很简单:
您可以尝试这种方式,但这意味着将所有数据传递到组件中,并丢失vuex缓存和改进...这全都是代码首选项的问题。