[英]click event on div and filter vuex data --vue.js
我被困在这一点上:导出过滤器功能并在vuex存储中使用它。 到这里没问题。 现在我试图将@click
事件放在div上。 例如,当我单击时。 奥迪,过滤器需要仅显示“ audi”,如果我再次单击“ audi”,则需要将其从过滤器中删除。
这是沙箱: https : //codesandbox.io/s/filtering-bzphi
filter.js
export const carFilter = car => allcars => {
if (car.length > 0) {
if (allcars.name.includes(car)) {
return true;
} else {
return false;
}
} else {
return true;
}
};
商店
export const store = new Vuex.Store({
state: {
cars: [
{ name: "AUDI" },
{ name: "BMW" },
{ name: "MERCEDES" },
{ name: "HONDA" },
{ name: "TOYOTA" }
],
carBrand: []
},
mutations: {
updateCarsFilter(state, carBrand) {
state.carBrand = carBrand;
}
},
getters: {
filteredCars: state => {
return state.cars.filter(carFilter(state.carBrand));
}
}
});
和App.js
<template>
<div id="app">
<div class="boxes" :key="index" v-for="(item, index) in cars">{{item.name}}</div>
<List/>
</div>
</template>
<script>
import List from "./List.vue";
export default {
name: "App",
components: {
List
},
computed: {
selectBrand: {
set(val) {
this.$store.commit("updateCarsFilter", val);
},
get() {
return this.$store.state.carBrand;
}
},
cars() {
return this.$store.getters.filteredCars;
}
}
};
</script>
我还为此创建了一个沙箱。 您可以检查一下以更好地理解。 https://codesandbox.io/s/filtering-bzphi
在store.js中
clearFilter
isActiveFilter
更新
carBrand
selectedCars
carBrand
突变 addCarSelection
removeCarSelection
filteredCars
返回selectedCars数组,否则返回cars
状态 isSelectedCar
来检查isSelectedCar
中是否有汽车 不再需要carFilter
函数。
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
export const store = new Vuex.Store({
state: {
cars: [
{ name: "AUDI" },
{ name: "BMW" },
{ name: "MERCEDES" },
{ name: "HONDA" },
{ name: "TOYOTA" }
],
selectedCars: []
},
mutations: {
addCarSelection(state, car) {
state.selectedCars.push(car);
},
removeCarSelection(state, car) {
state.selectedCars = state.selectedCars.filter(r => r.name !== car.name);
}
},
getters: {
filteredCars: state => {
if (state.selectedCars.length !== 0) {
// There's selected cars, return filtered
return state.selectedCars;
} else {
return state.cars;
}
},
isSelectedCar: state => car => {
return state.selectedCars.some(r => r.name === car.name);
}
}
});
在App.vue中
filterCars
(从计算属性移动searchText
) clearFilter
更新
filterCars
和' filterCars
'方法,并从商店映射了新的变异和吸气剂 methods: {
addCarSelection(car) {
this.$store.commit("addCarSelection", car);
},
removeCarSelection(car) {
this.$store.commit("removeCarSelection", car);
},
isSelectedCar(car) {
return this.$store.getters.isSelectedCar(car)
},
}
isFilterActive()
计算属性 更新
isFilterActive()
和searchText
从计算属性 computed: {
cars() {
return this.$store.getters.filteredCars;
},
},
更新
框始终显示可用的汽车,如果isSelectedCar
在添加或移除功能之间切换。
如果未列出完整的汽车目录,则列出显示选定的汽车。
<template>
<div id="app">
<div class="boxes" :key="index" v-for="(item, index) in cars">
<div
v-if="!isSelectedCar(item)"
style="cursor:pointer"
@click="addCarSelection(item)"
>{{item.name}}</div>
<div v-else style="cursor:pointer;" @click="removeCarSelection(item)">
{{item.name}}
<small>[x]</small>
</div>
</div>
<List/>
</div>
</template>
此沙箱中提供了更新的版本
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.