【问题标题】:uncheck all checkboxes from child component Vue.js取消选中子组件 Vue.js 中的所有复选框
【发布时间】:2026-02-06 00:50:01
【问题描述】:

我有以下问题:我有一个带有复选框列表和两个输入的父组件。因此,当这两个输入中的任何一个发生更改时,我需要取消选中所有复选框。如果您能帮我解决这个问题,我将不胜感激。 我想更改checkedItem 以在子级中触发watch,然后更新所有子级,但它不起作用。

parent.vue

      <template>
        <div class="filter-item">
            <div class="filter-checkbox" v-for="item in filter.items">
                <checkbox :item="item" v-model="checkedItem"> {{ item }} </checkbox>
            </div>
            <div class="filter-range">
                <input v-model.number="valueFrom">
                <input v-model.number="valueTo">
            </div>
        </div>
    </template>
<script>
    import checkbox from '../checkbox.vue'

    export default {
        props: ['filter'],
        data() {
            return {
                checkedItem: false,
                checkedItems: [],
                valueFrom: '',
                valueTo: '',
            }
        },
    watch: {
        'checkedItem': function () {},
        'valueFrom': function () {},
        'valueTo': function () {}
    },
    components: {checkbox}
}
</script>

child.vue

<template>
    <label>
        <input :value="value" @input="updateValue($event.target.value)" v-model="checked" class="checkbox"
               type="checkbox">
        <span class="checkbox-faux"></span>
        <slot></slot>
    </label>
</template>

<script>
    export default {
        data() {
            return {
                checked: ''
            }
        },
        methods: {
            updateValue: function (value) {
                let item = this.item
                let checked = this.checked
                this.$emit('input', {item, checked})
            }
        },

        watch: {
            'checked': function () {
                this.updateValue()
            },
        },

        created: function () {
            this.checked = this.value
        },

        props: ['checkedItem', 'item']
    }
</script>

【问题讨论】:

  • 我是 Vuejs 新手,但在我看来,“已检查”手表只是调用 updateValue 函数,但它不返回任何值
  • 如何将checkedItem 更改为checkedItem = []。有用吗?
  • @HarshalCarpenter,不,它没有:(

标签: javascript vue.js


【解决方案1】:

当您的v-for 在父组件中渲染时,所有渲染的filter.items 都绑定到同一个checkedItem v-model。

要纠正此问题,您需要执行以下操作:

<div class="filter-checkbox" v-for="(item, index) in filter.items">
    <checkbox :item="item" v-model="item[index]> {{ item }} </checkbox>
</div>

要解决您的其他问题,更新子组件列表就像更新filter.items 一样简单。

如果你不想使用观察者,你甚至不需要观察者。这是一个替代方案:

<input v-model.number="valueFrom" @keypress="updateFilterItems()">

然后:

methods: {
    updateFilterItems () {
        // Use map() or loop through the items
        // and uncheck them all.
    }
}

总是问自己两次是否需要watch。它会产生不必要的复杂性。

【讨论】:

  • 但我没有提供所有信息。我需要使用复选框,以便当您单击任何值时应显示在这些输入中。我是 JS 和 Vue 的新手,所以也许我不明白应该如何很好地实现它。对不起,但我看不出方法 updateFilterItems() 有什么帮助。如果我将创建一个包含项目的数组,我应该查看所有项目以查看更新?如果过滤器包含 1000 个项目怎么办?
最近更新 更多