[英]Javascript - How to filter with multiple checkboxes in Vue.js?
[英]Javascript - How to filter data with multiple arrays in Vue.js?
我正在使用 Vue.js 3 並且在這種情況下我有一個用於一個數組的過濾器類型,但是如何與另一個數組連接,例如這里的一個類別? 我嘗試了同樣的方法,但我只得到了重復
https://stackoverflow.com/users/3330981/tauzn如果你有時間,你可以檢查一下嗎?
這是我的代碼
<template>
<div>
<form>
<input type="checkbox" name="drama" v-model="filters.drama"/>
<label for="drama">drama</label>
<input type="checkbox" name="comedy" v-model="filters.comedy"/>
<label for="comedy">comedy</label>
<input type="checkbox" name="horror" v-model="filters.horror"/>
<label for="horror">horror</label>
<input type="checkbox" name="polovno" v-model="filters.new"/>
<label for="new">new</label>
</form>
<div v-for="(movie) in filteredMovies" :key="movie.title">
<div>
{{ movie.title }}
</div>
</div>
</div>
</template>
<script>
export default {
data: ()=>({
filters: {
horror: true,
comedy: true,
drama: true,
new:true,
old:true,
},
movies: [
{ title: 'Movia A', genres: ['horror'], category:['new']},
{ title: 'Movia B', genres: ['comedy'], category:['old']},
{ title: 'Movia C', genres: ['drama'], category:['new']},
{ title: 'Movia D',genres: ['horror'], category:['new']},
]
}),
computed: {
filteredMovies(){
return this.movies.filter( movie => {
let selectedGenres = Object.keys(this.filters).filter(item => this.filters[item] === true)
return movie.genres.some(item => selectedGenres.includes(item))
})
},
filteredMoviesByCategory(){
return this.movies.filter( movie => {
let selectedCategory = Object.keys(this.filters).filter(item => this.filters[item] === true)
return movie.category.some(item => selectedCategory.includes(item))
})
}
},
}
</script>
所以我有復選框,這對於流派過濾非常有效,但是在這種情況下如何將它與另一個數組連接起來呢? 我是 Vue.js 的新手,這對我有很大幫助
我找到了一個解決方案,使用其他虛擬數據但有效。
這是我的代碼
<template>
<h5>List of Products</h5>
<h3>Filter</h3>
<button v-on:click="resetOptions">Reset</button>
<button v-on:click="sorting">Sorting</button>
<button v-on:click="sorting2">Sorting2</button>
<select v-model="category">
<option value="Accessories">Accessories</option>
<option value="Laptop">Laptop</option>
<option value="Stationary">Stationary</option>
</select>
<select v-model="gradovi">
<option value="Podgorica">Podgorica</option>
<option value="Niksic">Niksic</option>
<option value="Herceg Novi">Herceg Novi</option>
</select>
<input type="text" v-model="name" placeholder="Filter By Name"/>
<label for="vol">Price (between 0 and 1000):</label>
<input type="range" v-model.trim="range" min="0" max="1000" step="10"/>
<ul>
<li v-for="product in filterProducts" :key="product.name"> Product Name : {{product.name}} - Price : {{product.price}} ({{product.category}})
{{product.gradovi}}
</li>
</ul>
</template>
<script>
export default {
data: ()=> ( {
gradovi:'',
category: '',
name: '',
range: '0',
products: [
{ name: "Keyboard", price: 44, category: 'Accessories', gradovi:'Podgorica'},
{ name: "Mouse", price: 20, category: 'Accessories', gradovi:'Niksic'},
{ name: "Monitor", price: 399, category: 'Accessories', gradovi:'Herceg Novi'},
{ name: "Dell XPS", price: 599, category: 'Laptop', gradovi:'Podgorica'},
{ name: "MacBook Pro", price: 899, category: 'Laptop', gradovi:'Podgorica'},
{ name: "Pencil Box", price: 6, category: 'Stationary', gradovi:'Niksic'},
{ name: "Pen", price: 2, category: 'Stationary', gradovi:'Niksic'},
{ name: "USB Cable", price: 7, category: 'Accessories', gradovi:'Herceg Novi'},
{ name: "Eraser", price: 2, category: 'Stationary', gradovi:'Podgorica'},
{ name: "Highlighter", price: 5, category: 'Stationary', gradovi:'Niksic'}
]
}),
computed: {
filterProducts: function(){
return this.filterProductsByName(this.filterProductsByRange(this.filterProductsByCity(this.filterProductsByCategory(this.products))))
},
},
methods: {
filterProductsByCategory: function(products){
return products.filter(product => !product.category.indexOf(this.category))
},
filterProductsByName: function(products) {
return products.filter(product => !product.name.toLowerCase().indexOf(this.name.toLowerCase()))
},
filterProductsByCity: function(products) {
return products.filter(product => !product.gradovi.indexOf(this.gradovi))
},
filterProductsByRange: function(products){
return products.filter(product => (product.price >= 0 && product.price <= this.range) ? product : '')
},
sorting:function(){
this.products.sort((a,b)=>(a.price > b.price) ? 1 : -1)
},
sorting2:function(){
this.products.sort((a,b)=>(a.price < b.price) ? 1 : -1)
},
resetOptions:function(){
this.category='',
this.gradovi='',
this.name='',
this.range='1000'
},
},
}
</script>
<style>
</style>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.