【问题标题】:Check / Uncheck a Checkbox in a child component with vuejs使用 vuejs 选中/取消选中子组件中的复选框
【发布时间】:2020-10-07 07:01:58
【问题描述】:

上下文:

我是第一次在项目中使用 VueJS,所以我可能没有正确使用它。

我有一个父组件和一个子组件:

Parent : ResearchProducts.vue :显示可以按类别过滤的产品列表。过滤器是与产品类别相关的复选框。

Child : CategoryDisplay.vue : 这是处理视图和类别行方法的组件。

我的问题:

当我单击子组件内的类别复选框并且选中该复选框时,该类别将添加到父组件中的过滤器列表中。这行得通。

当我取消选中该复选框时,该类别将从该列表中删除。这也有效。

现在,我已将所有类别显示为父组件中的按钮,以使过滤器更容易对用户可见。我的问题是我希望这个按钮在我点击它时取消选中子组件内的相关复选框。

这是我的实际代码:

ResearchProducts.vue:

<template>
 <div>
     <template v-for="category in categories">
          <category-display
                 :category="category"
                 :key="'category_'+category.id"
                 :checked="checked"
                 @categorySelected="categorySelected"
               ></category-display>
     </template>
     <button
               v-for="filter in listFilters"
               :key="'filter_'+filter.slug"
               class="btn btn-light btn-sm mr-2 mb-2"
               @click="removeFilter(filter)"
             >
               {{ filter.name }}
      </button>
 </div>
</template>
<script>
export default {

  data() {

    return {

      categories: { // HERE A COLLECTION CONTAINING ALL MY CATEGORIES },

      selectedCategories: [],

      listFilters: []

    };

  },

  methods: {

    categorySelected(category) {

      var newCategory = {

        type: "category",

        slug: category.slug,

        name: category.name

      };

      if (category.checked) {

        if (!this.selectedCategories.includes(category.slug)) {

          this.selectedCategories.push(category.slug);

          this.listFilters.push(newCategory);

        }

      } else {

        if (this.selectedCategories.includes(category.slug)) {

          const index = this.selectedCategories.indexOf(category.slug);

          if (index > -1) {

            this.selectedCategories.splice(index, 1);

          }

        }

        this.listFilters = this.listFilters.filter(function(item) {

          for (var key in newCategory) {

            if (item[key] === undefined || item[key] == newCategory[key])

              return false;

          }

          return true;

        });

      }

    },

    removeFilter(filter) {
     // THERE, I NEED TO UNCHECK THE RELATED CHECKBOX IN CHILD COMPONENT
     this.listFilters = this.listFilters.filter(function(item) {
        for (var key in filter) {
          if (item[key] === undefined || item[key] == filter[key]) return false;
        }
        return true;
      });

    }

  }

};
</script>

CategoryDisplay.vue

<template>
  <b-form-checkbox-group class="w-100">
    <b-form-checkbox :value="category.slug" class="w-100" @input="selection" v-model="selected" ref="checked">
      {{ category.name }}
      <span class="badge badge-secondary float-right">{{ category.products_count }}</span>
    </b-form-checkbox>
  </b-form-checkbox-group>
</template>

<script>
export default {
  props: {
    category: {
      type: Object,
      required: true
    }
  },

  data() {
    return {
      selected: false
    }
  },

  methods: {
    selection() {
      var response = false;
      if(this.selected.length !== 0){
        response = true;
      }
      this.$emit('categorySelected', {slug: this.category.slug, name: this.category.name, checked: response});
    }
  }
};
</script>

【问题讨论】:

  • 你能为此创建一个演示吗?
  • 你在我还没来得及创建演示之前就回答了我的问题,你是我的英雄 :)

标签: javascript vue.js checkbox vuejs2 vue-component


【解决方案1】:

这是一个简化的示例供您参考。您可以使用sync 修饰符来实现父子之间的双向绑定。这与子中的计算属性一起使用settergetter

因此将所有类别传递给孩子,并同步选定的类别:

<HelloWorld :cats.sync="selectedCategories" :categories="categories"/>

子组件获取类别,迭代并显示复选框。这里我们使用计算属性,当一个复选框被单击时,setter 将更改发送给父级:

<label v-for="c in categories" :key="c.id">
  <input v-model="temp" type="checkbox" :value="c">
  {{ c.name }}
</label>

脚本:

computed: {
  temp: {
    get: function() {
      return this.cats;
    },
    set: function(newValue) {
      this.$emit("update:cats", newValue);
    }
  }
}

而父级只是简单地迭代selectedCategories,并且如您所愿,当selectedCategories 的父级发生更改时,子级将自动知道何时删除项目。

这是供您参考的完整示例:SANDBOX

【讨论】:

  • 这真的很好,正是我想要的。我要试一试,我会将问题标记为已解决。非常感谢。
  • 正如预期的那样,您的解决方案完美运行。谢谢!
  • 你知道我是否可以在 selectedCategories 更改时触发父组件中的方法吗?添加或删除类别时(由复选框和按钮触发)
  • 我是通过在“set”函数中添加this.$emit("clickedCheckbox"); 来实现的。这是有效的
  • 很好的例子。效果最好且最容易实施。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2013-11-19
相关资源
最近更新 更多