Bea*_*eau 8 javascript recursion nested vue.js vuex
假设我有以下树:
[
{
name: 'asd',
is_whatever: true,
children: [
{
name: 'asd',
is_whatever: false,
children: [],
},
],
},
],
Run Code Online (Sandbox Code Playgroud)
树通过Vuex在键'tree'下存储在模块中,并通过以下称为'recursive-item'的递归组件循环:
<li class="recursive-item" v-for="item in tree">
{{ item.name }}
<div v-if="item.is_whatever">on</div>
<div v-else>off</div>
<ul v-if="tree.children.length">
<recursive-item :tree="item.children"></recursive-item>
</ul>
</li>
Run Code Online (Sandbox Code Playgroud)
现在我想切换项目的属性'is_whatever',所以我附加了一个监听器
<div v-if="item.is_whatever"
@click="item.is_whatever = !item.is_whatever">on</div>
<div v-else>off</div>
Run Code Online (Sandbox Code Playgroud)
当我点击它,它工作,但发出以下
"Error: [vuex] Do not mutate vuex store state outside mutation handlers."
[vuex] Do not mutate vuex store state outside mutation handlers.
Run Code Online (Sandbox Code Playgroud)
如果没有这个错误,我该如何实现呢?我看不到如何分派动作或将事件发送到树的顶部,因为它是嵌套和递归的,所以我没有到特定项目的路径,对吧?
在那天晚上晚些时候与其他一些开发人员协商后,我们提出了几种实现方法。因为数据嵌套在树中并且我以递归方式访问节点,所以我需要获取特定节点的路径,例如将节点的索引作为属性传递,然后在重复的同时添加子索引递归地在每个节点中,或仅传递节点的 id,然后在操作中运行递归循环以切换其属性。
更优化的解决方案可能是扁平化数据结构,从而避免递归的需要。然后可以通过 id 直接访问该节点。
| 归档时间: |
|
| 查看次数: |
3561 次 |
| 最近记录: |