javascript - v-list-item-group 一次选择所有/取消选择所有项目

标签 javascript vue.js vuetify.js

我想为我的 Vue 应用程序使用 Vuetify 的 v-list-item-group 组件。此列表表示与图形相关的节点。我可以全选、部分或全部选择并删除所选的。

为了更好的用户体验,我想在标题旁边的顶部提供一个“全选/取消全选”复选框。如果仅选择了一些节点,则复选框应呈现不确定状态。

目前这是我正在使用的代码

<div id="app">
    <v-app id="inspire">
        <v-list>
            <v-list-item>
                <v-list-item-action>
                    <v-checkbox :indeterminate="someNodesSelected" :input-value="allNodesSelected"  @click="toggleCompleteSelection" />
                </v-list-item-action>
                <v-list-item-content>
                    <v-list-item-title v-text="graphWithNodes.name"></v-list-item-title>
                </v-list-item-content>
                <v-list-item-action>
                    <v-btn icon :disabled="noNodesSelected" @click="deleteNodes">
                        <v-icon color="error">mdi-delete</v-icon>
                    </v-btn>
                </v-list-item-action>
            </v-list-item>
            <v-list-item-group v-model="selectedNodeIds" multiple>
                <v-list-item v-for="node in graphWithNodes.nodes" :key="node.id" :value="node.id">
                    <template v-slot:default="{ active, toggle }">
                        <v-list-item-action>
                            <v-checkbox :input-value="active" :true-value="node.id" @click="toggle" />
                        </v-list-item-action>
                        <v-list-item-content>
                            <v-list-item-subtitle v-text="node.id"></v-list-item-subtitle>
                        </v-list-item-content>
                    </template>
                </v-list-item>
            </v-list-item-group>
        </v-list>
    </v-app>
</div>

new Vue({
    el: '#app',
    vuetify: new Vuetify(),
    data() {
        return {
            selectedNodeIds: [],
            graphWithNodes: {
                id: 1,
                name: "The graph",
                nodes: [{
                    id: 1,
                    graphId: 1
                }, {
                    id: 2,
                    graphId: 1
                }]
            },
        }
    },
    computed: {
        noNodesSelected() {
            return this.selectedNodeIds.length === 0;
        },
        someNodesSelected() {
            return this.selectedNodeIds.length > 0 && !this.allNodesSelected;
        },
        allNodesSelected() {
            return (
                this.selectedNodeIds.length === this.graphWithNodes.nodes.length
            );
        }
    },
    methods: {
        deleteNodes(nodeIds) {
            for (const nodeId of this.selectedNodeIds) {
                this.deleteNode(nodeId);
            }
            this.selectedQueueIds = [];
        },
        deleteNode(id) {
            this.graphWithNodes.nodes = this.graphWithNodes.nodes.filter(node => node.id !== id);
        },
        toggleCompleteSelection() {
          if(this.noNodesSelected || this.someNodesSelected) {
             this.selectedNodeIds = this.graphWithNodes.nodes.map(node => node.id);
          } else {
            this.selectedNodeIds = [];
          }
        }
    }
})

如果你想玩,我为此创建了一个 codepen

https://codepen.io/magicfoobar/pen/RwPBNmV?editors=1010

所以我遇到的问题是,当我单击标题复选框时,函数 toggleCompleteSelection 被执行了两次,我不知道为什么。

有人知道标题复选框损坏的原因以及如何修复吗?

提前致谢

最佳答案

如果您将复选框触发器从 @click 更改为 @change,它会起作用

<v-checkbox 
:indeterminate="someNodesSelected" 
:input-value="allNodesSelected"  
@change="toggleCompleteSelection" />

关于javascript - v-list-item-group 一次选择所有/取消选择所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60760667/

相关文章:

vue.js - 如何在 VueJs 的模板中加载外部 html 文件

vue.js - 如何让图像在 Vuetify 中工作?

javascript - 在外部触发的事件中使用原始 `this`

javascript - 如何正则表达式匹配整个字符串而不是单个字符

javascript - 使用 node-gyp configure 更改处理器架构

JavaScript Jest 测试;使用回调函数修改数组中的元素

javascript - ASP.NET MVC - 将包含数组的 FormData 映射到模型类

vue.js - 通过参数传递的 id 在页面刷新时丢失

javascript - 在 Vue 中渲染多个组件期间显示加载

css - 如何根据同胞子属性更改样式