Vue 通过多个复选框过滤列表
Vue filter list by multiple checkboxes
我有这样一个数据列表
[
{
"name":"UMBERTO",
"description":"Some description",
"application_area":{
"LegalCompliance":false,
"Certification":true,
"Accounting":true,
"LifeCycle":true,
"Reporting":true,
"DecisionSupport":true,
"CompanyAssociations":true
},
"object_of_observation":{
"Waste":false,
"Facilities":false,
"DangerousSubstances":false,
"Emission":false,
"Energy":true,
"MaterialFlow":true,
}
},
...
]
我想通过几个复选框过滤此列表,如下所示:
过滤器应该通过逻辑 AND 连接,现在我为每个复选框都有一个布尔 v-model 值。是否有更高效的数据结构以及如何将过滤器应用于数据列表?我正在使用 vuetify 数据-table
您可以将对象用作字典来存储所有过滤器的 isActive
状态;
您的 data()
看起来像这样:
data() {
return {
isFilterActiveMap: {
"Abfall": false,
"Gefahrstoffe": false,
"Energie": false,
}
}
}
然后,如果你需要将有源过滤器作为一个数组来获取,你可以做一个计算值:
computed: {
activeFilters() {
return Object.entries(this.isFilterActiveMap)
.filter(([filterType, isActive]) => isActive === true)
.map(([filterType]) => filterType);
}
}
但是,caveat 需要记住的是,您需要使用 this.$set
更新对象,如下所示:
methods: {
updateFilter(filterType, isActive) {
this.$set(this.isFilterActiveMap, filterType, isActive);
}
}
使用这种方法,您最初也不需要将所有过滤器添加到 data()
。你可以有一个像这样的 loadFilters
方法:
methods: {
loadFilters(filters) {
const isFilterActiveMap = {};
for (const filter of filters) {
isFilterActiveMap[filter] = false;
}
this.isFilterActiveMap = isFilterActiveMap;
}
}
然后你可以将你的过滤器作为一个数组,如果它不需要是反应性的,甚至可以在你的组件声明之外:
const filters = ["filter1", "filter2", "filter3"];
export default {
created() {
this.loadFilters(filters);
}
}
或从 API:
获取它们
export default {
created() {
this.fetchFilters().then((filters) => {
this.loadFilters(filters);
});
}
}
我有这样一个数据列表
[
{
"name":"UMBERTO",
"description":"Some description",
"application_area":{
"LegalCompliance":false,
"Certification":true,
"Accounting":true,
"LifeCycle":true,
"Reporting":true,
"DecisionSupport":true,
"CompanyAssociations":true
},
"object_of_observation":{
"Waste":false,
"Facilities":false,
"DangerousSubstances":false,
"Emission":false,
"Energy":true,
"MaterialFlow":true,
}
},
...
]
我想通过几个复选框过滤此列表,如下所示:
过滤器应该通过逻辑 AND 连接,现在我为每个复选框都有一个布尔 v-model 值。是否有更高效的数据结构以及如何将过滤器应用于数据列表?我正在使用 vuetify 数据-table
您可以将对象用作字典来存储所有过滤器的 isActive
状态;
您的 data()
看起来像这样:
data() {
return {
isFilterActiveMap: {
"Abfall": false,
"Gefahrstoffe": false,
"Energie": false,
}
}
}
然后,如果你需要将有源过滤器作为一个数组来获取,你可以做一个计算值:
computed: {
activeFilters() {
return Object.entries(this.isFilterActiveMap)
.filter(([filterType, isActive]) => isActive === true)
.map(([filterType]) => filterType);
}
}
但是,caveat 需要记住的是,您需要使用 this.$set
更新对象,如下所示:
methods: {
updateFilter(filterType, isActive) {
this.$set(this.isFilterActiveMap, filterType, isActive);
}
}
使用这种方法,您最初也不需要将所有过滤器添加到 data()
。你可以有一个像这样的 loadFilters
方法:
methods: {
loadFilters(filters) {
const isFilterActiveMap = {};
for (const filter of filters) {
isFilterActiveMap[filter] = false;
}
this.isFilterActiveMap = isFilterActiveMap;
}
}
然后你可以将你的过滤器作为一个数组,如果它不需要是反应性的,甚至可以在你的组件声明之外:
const filters = ["filter1", "filter2", "filter3"];
export default {
created() {
this.loadFilters(filters);
}
}
或从 API:
获取它们export default {
created() {
this.fetchFilters().then((filters) => {
this.loadFilters(filters);
});
}
}