vue 3 组合 api,基于反应数据的链接过滤器
vue 3 composition api, chaining filters uppon reactive data
我有一个 orbject 数组作为数据,我想有几个 select 菜单以便过滤数据并以反应方式在屏幕上显示它。
我已经设法让一个过滤器工作,但这里的想法是能够链接过滤器,以便可以通过 select vlaues.
的任意组合来过滤结果。
我已将我的代码分解为以下最简单的示例:
<template>
<div class="mp" style="width: 100vw;">
<div class="col-2">
<span class="lbl">FILTER1</span>
<select v-model="selectedMA" class="form-select" >
<option value="">all</option>
<option value="Germany">Germany</option>
</select>
</div>
<div class="col-2">
<span class="lbl">FILTER2</span>
<select v-model="selectedMA2" class="form-select" >
<option value="">all</option>
<option value="Tier1">Tier1</option>
</select>
</div>
<p>DATA :</p>
<p> {{actorListTest2}} </p>
</div>
</template>
<script >
import {onMounted, onBeforeMount, ref, computed, watch} from 'vue'
import getActorDocs from '../composables/getActorDocs'
export default {
setup(){
const {actorDocs, loadActors} = getActorDocs()
const selectedMA = ref("all")
const selectedMA2 = ref("all")
loadActors(); // load data
var filteredActors = actorDocs
const actorListTest2 = computed(() => {
if(selectedMA.value == "all" && selectedMA2.value == "all"){return filteredActors}
else{
return filteredActors.filter(obj => {
return obj.country == selectedMA.value
}).filter(obj => {
return obj.type == selectedMA2.value
})}
});
return {filteredActors, actorListTest2, selectedMA, selectedMA2, actorDocs}
}//setup
}
</script>
<style scoped>
</style>
受此 post (Array filtering with multiple conditions javascript) 的启发,我找到了一种方法让它发挥作用。可能不是最好的方法,但它有效
const actorListTest2 = computed(() => {
if(selectedMA.value == "" && selectedMA2.value == ""){return filteredActors}
else {
return filteredActors.filter(obj => {
return (!selectedMA2.value.length || obj.type == selectedMA2.value)
&& (!selectedMA.value.length || obj.country == selectedMA.value)
})}
});
我有一个 orbject 数组作为数据,我想有几个 select 菜单以便过滤数据并以反应方式在屏幕上显示它。 我已经设法让一个过滤器工作,但这里的想法是能够链接过滤器,以便可以通过 select vlaues.
的任意组合来过滤结果。我已将我的代码分解为以下最简单的示例:
<template>
<div class="mp" style="width: 100vw;">
<div class="col-2">
<span class="lbl">FILTER1</span>
<select v-model="selectedMA" class="form-select" >
<option value="">all</option>
<option value="Germany">Germany</option>
</select>
</div>
<div class="col-2">
<span class="lbl">FILTER2</span>
<select v-model="selectedMA2" class="form-select" >
<option value="">all</option>
<option value="Tier1">Tier1</option>
</select>
</div>
<p>DATA :</p>
<p> {{actorListTest2}} </p>
</div>
</template>
<script >
import {onMounted, onBeforeMount, ref, computed, watch} from 'vue'
import getActorDocs from '../composables/getActorDocs'
export default {
setup(){
const {actorDocs, loadActors} = getActorDocs()
const selectedMA = ref("all")
const selectedMA2 = ref("all")
loadActors(); // load data
var filteredActors = actorDocs
const actorListTest2 = computed(() => {
if(selectedMA.value == "all" && selectedMA2.value == "all"){return filteredActors}
else{
return filteredActors.filter(obj => {
return obj.country == selectedMA.value
}).filter(obj => {
return obj.type == selectedMA2.value
})}
});
return {filteredActors, actorListTest2, selectedMA, selectedMA2, actorDocs}
}//setup
}
</script>
<style scoped>
</style>
受此 post (Array filtering with multiple conditions javascript) 的启发,我找到了一种方法让它发挥作用。可能不是最好的方法,但它有效
const actorListTest2 = computed(() => {
if(selectedMA.value == "" && selectedMA2.value == ""){return filteredActors}
else {
return filteredActors.filter(obj => {
return (!selectedMA2.value.length || obj.type == selectedMA2.value)
&& (!selectedMA.value.length || obj.country == selectedMA.value)
})}
});