【问题标题】:v-list-item-group select all / deselect all items at oncev-list-item-group 一次全选/取消全选
【发布时间】:2020-06-30 19:03:30
【问题描述】:

我想为我的 Vue 应用使用 Vuetify 的 v-list-item-group 组件。此列表表示与图相关的节点。我可以不选择任何、部分或全部,然后删除选定的。

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

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

<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 = [];
          }
        }
    }
})

如果你想玩,我为此创建了一个代码笔

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

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

有人知道为什么标题复选框坏了以及如何修复它吗?

提前致谢

【问题讨论】:

    标签: javascript vue.js vuetify.js


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      只需在click 之后添加.stop 即可。

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

      codepen - https://codepen.io/Pratik__007/pen/MWwBKRL?editors=1010

      【讨论】:

      • 我更喜欢这个而不是我的回答!
      • @Patel Pratik 感谢您的回答。我认为change 事件似乎是更好的解决方案,因为我在文档中找到了它......但也许你可以告诉我使用.stop 是一个更好的解决方案
      • 我刚刚给出了这个解决方案,因为它符合您的逻辑。我也将使用@change。
      【解决方案3】:

      我不确定您是否需要直接从复选框运行toggleCompleteSelection

      我会使用 Watcher 实现“全选”功能,请参阅 https://codepen.io/joffff/pen/06cd75ea651660d13d4ddc288b8448d7?editors=1010

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 2012-02-03
        相关资源
        最近更新 更多