假设我有下面的树:

[
    {
        name: 'asd',
        is_whatever: true,
        children: [
            {
                name: 'asd',
                is_whatever: false,
                children: [],
            },
        ],
    },
],

该树通过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>

现在我想切换项的属性"is_whatever",所以我附加了一个侦听器

    <div v-if="item.is_whatever" 
         @click="item.is_whatever = !item.is_whatever">on</div>
    <div v-else>off</div>

当我点击它时,它会工作,但会发出以下信号

"Error: [vuex] Do not mutate vuex store state outside mutation handlers."
[vuex] Do not mutate vuex store state outside mutation handlers.

如果没有这个错误,我应该如何实现它?我看不出如何将动作或事件分派到树的顶部,因为它是嵌套的和递归的,所以我没有特定项的路径,对吗?

推荐答案

那天晚上晚些时候,我们咨询了一些其他开发人员后,得出了一些实现方法.因为数据嵌套在树中,我以递归方式访问 node ,所以我需要获取特定 node 的路径,例如,将 node 的索引作为属性传递,然后添加子索引,同时在每个 node 中递归地重复该操作,或者只传递 node 的id,然后在操作中运行递归循环以切换其属性.

更优化的解决方案可以是将数据 struct 扁平化,从而避免递归的需要.然后可以通过id直接访问 node .

Vue.js相关问答推荐

无法解析组件:google—pay—button

如何用其他组件编译Vue模板?

将 html 文件移出 dist vite 中的 src 文件夹

Nuxt3 / Vue3 - 当属性更改时如何动态更改渲染组件?

在 vue.js 中添加新类时样式不适用

Vue,Composition API:如何从react 式转换中跳过深度嵌套的属性?

VueJS:在组件之间使用全局对象的最佳实践?

Vue.js 过滤数组

VueJS + VueRouter:有条件地禁用路由

如何在 vue 3 脚本设置中的组件上使用 v-model

如何在 Vue.js 中传递 $router.push 中的数据?

Nuxt 应用程序在刷新动态路由时返回 404(Tomcat 服务器)

如何将 Angular 和 Vue 项目合并在一起?

VueJS 2 在多个组件上debounce

$set 不是函数

在vue中单击时如何模糊元素

Vue Router beforeRouteLeave 不会停止子组件

为什么 router.currentRoute.path 没有react?

如何在 vuejs 中的基于类的组件中编写计算设置器

在 vue.js 应用程序中将静态内容(例如国家代码)存储在哪里?