javascript - 取消选中子组件 Vue.js 中的所有复选框

标签 javascript vue.js

我遇到以下问题:我的父组件带有复选框列表和两个输入。因此,当这两个输入中的任何一个发生更改时,我需要取消选中所有复选框。如果您能帮我解决这个问题,我将不胜感激。 我想更改 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>

最佳答案

当您的 v-for 在父组件中渲染时,所有渲染的 filter.items 都绑定(bind)到相同的 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.
    }
}

总是问自己两次是否有必要观看。它可能会造成不必要的复杂性。

关于javascript - 取消选中子组件 Vue.js 中的所有复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46368823/

相关文章:

javascript - 如何使用 JavaScript 显示/隐藏 HTML 元素

typescript - 使用 TypeScript 的 Vue Prop 类型

javascript - Element Ui 组件不会在 vue 组件 prop 更改时重新渲染

google-chrome - Vue.js 中 Chrome 和 Datalist 的性能问题

javascript - 如何为每个元素添加唯一的事件监听器

javascript - TypeScript 构造函数类型安全

javascript - D3 折线图 y 轴被裁剪

javascript - Fullpage.js 通过向下滚动水平滚动并在一个部分再次完成水平滚动后向下滚动?

javascript - 如何停止 bootstrapValidator 来验证隐藏的输入字段?

css - 如何使用 webpack 导入 css?