我在一个数组中有几个曲目,并有一个搜索和复选框来过滤曲目。然而,复选框只返回每个过滤器中的第一个识别字符串。因此,如果我单击pop的复选框-在下面的示例中-它将只显示仅包含流行流派的曲目。包含摇滚,流行流派的曲目不会出现。这是在Vue的composition API中。
以下是脚本:
const searchTerm = ref('')
const genreFilter = ref([])
const moodsFilter = ref([])
const tempoFilter = ref([])
const themeFilter = ref([])
const filteredTracks = computed(() => {
let filtered = useSong.tracks;
if (searchTerm.value) {
const term = searchTerm.value.toLowerCase();
filtered = filtered.filter(track =>
track.description.toLowerCase().includes(term) ||
track.genre.toLowerCase().includes(term) ||
track.keywords.toLowerCase().includes(term) ||
track.moods.toLowerCase().includes(term)
);
}
if (genreFilter.value.length > 0) {
filtered = filtered.filter(track => genreFilter.value.includes(track.genre))
}
if (moodsFilter.value.length > 0) {
filtered = filtered.filter(track => moodsFilter.value.includes(track.moods))
}
if (tempoFilter.value.length > 0) {
filtered = filtered.filter(track => tempoFilter.value.includes(track.tempo))
}
if (themeFilter.value.length > 0) {
filtered = filtered.filter(track => themeFilter.value.includes(track.theme))
}
return filtered;
});
下面是HTML:
<div class="genres w-1/4"><h1 class="font-bold text-[#aeaeae]">Genres</h1><br>
<input class="css-checkbox" type="checkbox" id="Rock" key="genre" value="Rock" v-
model="genreFilter">
<label class="css-label pl-2 text-s font-light text-[#aeaeae]" for="Rock">Rock</label>
<input class="css-checkbox" type="checkbox" id="Pop" key="genre" value="Pop" v-
model="genreFilter">
<label class="css-label pl-2 text-s font-light text-[#aeaeae]" for="Pop">Pop</label>
我如何修改它,以便我可以选中多个流派框,并让它们全部显示,只删除未选中的框。任何帮助都将不胜感激。此外,你会注意到,在过滤器中,我有一个用于情绪,克里思和主题。每当我点击这些复选框中的任何一个时,数组中没有显示任何内容,尽管数组具有匹配的情绪,节奏和主题。谢谢。
1条答案
按热度按时间8qgya5xd1#
genreFilter
变量是一个数组:但是你把整个事情放在复选框的
v-model
中:有效地用字符串代替数组。
所以当你这么做的时候
您调用的不是
Array.prototype.includes()
,而是String.prototype.includes()
。这可以工作,但不是您想要的。简单的解决方案是在复选框中使用索引:
一个可能更好的解决方案是在选中复选框时添加或删除元素:
和
下面是SFC中的安装脚本片段