假设我有下面的树:

[
    {
        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相关问答推荐

在VueJS中卸载元素之前是否应该删除JavaScript事件收件箱?

Nuxt 3 I18N浏览器检测不起作用

为什么在 Vue2 中调用 this.$emit() 后 props 没有立即更新?

何时将代码拆分为 Nuxt 中的组件?

为什么我在 Vue npm run serve 的 localhost 中得到无法获取

将函数作为属性传递给 Vue 组件

VuetifyJS,outer-link 未显示为光标

Nuxt.js 中的开发工具样式编辑问题

有条件地在 Vue 中添加一个 CSS 类

VueJs this.method 不是函数?如何在 Vuejs 的另一个方法中调用一个方法?

Vuetify - 如何保持第一个扩展面板默认打开,如果我打开另一个面板,其他面板应该关闭?

为什么 CSS 关键帧动画在具有范围样式的 Vue 组件中被 destruct ?

vue-test-utils:无法覆盖属性 $route,这通常是由于插件将该属性添加为只读值

Vuetify - 根据另一个 Select 选项过滤 Select 数据

在加载数据之前触发mounted方法 - VueJS

删除一行后刷新 Bootstrap-Vue 表

为 Vue 组件动态添加属性

重新加载页面正在 vue 组件中的插槽上闪烁内容

Bootstrap-vue:如何将数据传递给模态?

Vuetify RTL 风格