背景:
我第一次在项目中使用VueJS,所以我可能没有正确使用它。
我有一个父组件和一个子组件:
父级:ResearchProducts.vue:显示可以按类别筛选的产品列表。筛选器是与产品类别相关的复选框。
子项 : CategoryDisplay.vue :这是处理类别行的视图和方法的组件。
我的问题:
当我单击子组件中的类别复选框时,如果该复选框被选中,该类别将被添加到父组件的过滤器列表中。这个管用。
当我取消选中复选框时,该类别将从此列表中删除。这也有效。
现在,我已经在父组件中将我的所有类别显示为按钮,以便让用户更容易看到过滤器。我的问题是,当我单击这个按钮时,我希望它取消选中子组件中的相关复选框。
这是我的实际代码:
研究产品.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>
类别显示。视频:
<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>
这里有一个简化的样本供你参考。您可以使用< code>sync修饰符来实现父级和子级之间的双向绑定。以及带有< code>setter和< code>getter的子元素中的计算属性
因此,将所有类别传递给子类别,并同步所选类别:
<HelloWorld :cats.sync="selectedCategories" :categories="categories"/>
子组件采用类别、迭代并显示复选框。这里我们使用 computed 属性,当单击复选框时,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
的父级发生更改时,子级将自动知道项目何时被删除。
以下是供您参考的完整示例:沙盒
问题内容: 如何使用JavaScript,jQuery或Vanilla选中/取消选中复选框? 问题答案: Javascript: jQuery(1.6+): jQuery(1.5-):
下载整个项目。zip在这里 此问题的代码在Views文件夹中的CreateSchedule.aspx文件中。 以下是GridView的ASP.NET: 在取消选中某个框后调试事件时,网页上的复选框显示为未选中,但的值为true,即使该复选框在网页上显示为未选中。(chkRow是未选中的复选框) 更新3 我取得了一些突破。我发现复选框的问题在于嵌套的gridview位于使用JavaScript折叠和
我正在尝试一个Woocommerce票证插件。默认情况下,该插件会显示一个表,其中包含多个票证变体作为产品,并在下面显示一个文本字段作为其数量和一个提交按钮,以将产品添加到购物车中。 我想用单选按钮或复选框替换这个文本字段,这样用户就可以选择一种类型的票证,然后点击提交按钮将其中的一部分添加到购物车中。 我的想法是在foreach循环中创建一个复选框或单选按钮,该复选框或单选按钮的值为quanti
我创建了一个windows窗体(到目前为止)只包含复选框。构造函数接受一个参数:。对于这个数组中的每个字符串,我都会创建一个复选框。 例如: null 那么,当另一个复选框调用uncheck时,是否有一种方法可以告诉我的复选框不要运行? 下面是我的代码(它都是手工编写的,所以没有使用visual studio设计器):
问题内容: 所以我有这些复选框: 等等。它们大约有6个,并且是手工编码的(即,不是从数据库中获取的),因此它们可能会保持一段时间不变。 我的问题是如何将它们全部放入一个数组中(使用javascript),以便在使用Jquery 进行AJAX 请求时可以使用它们。 有什么想法吗? 编辑:我只希望将所选的复选框添加到数组 问题答案: 格式化: 希望它将成功。
问题内容: 如何在我的HTML表单中启用“提交”按钮,以及如果未选中此复选框则如何禁用? 此代码有什么问题? 复选框 问题答案: 将您的HTML更改为此: 原因不起作用:您没有传递任何函数。实际上,由于您没有在函数名称中使用括号,因此根本就没有调用函数。在HTML事件属性的上下文中传递它意味着您正在传递对该元素的DOM对象的引用,从而使您可以访问其属性。