Javascript - 如何在 Vue.js 中使用多个复选框进行过滤?

Posted

技术标签:

【中文标题】Javascript - 如何在 Vue.js 中使用多个复选框进行过滤?【英文标题】:Javascript - How to filter with multiple checkboxes in Vue.js? 【发布时间】:2021-07-08 20:25:52 【问题描述】:

这是我的过滤、排序和搜索代码,一切正常

<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> 
        <div>
        <input type="checkbox" name="test" id="test" v-model="city" value='Roma' @change="uniqueCheck">
        <label for="test"> Roma</label>
        <input type="checkbox" name="test2" id="test2" v-model.trim="city" value='Barselona' @change="uniqueCheck">
        <label for="test2"> Barselona</label>
        <input type="checkbox" name="test3" id="test3" v-model.trim="city" value='Milano' @change="uniqueCheck">
        <label for="test3"> Milano</label>
        </div>
         <!-- <select v-model="city">
            <option value="Barselona">Barselona</option>
            <option value="Roma"> Roma </option>
            <option value="Milano">Milano</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.city
            </li>
        </ul>
</template>

<script>
export default 
 data: ()=> ( 

           
            city:[ ],
            category: '',
            name: '',
            range: '10000',
            products: [
                 name: "Keyboard", price: 44, category: 'Accessories', city:'Roma',
                 name: "Mouse", price: 20, category: 'Accessories', city:'Barselona',
                 name: "Monitor", price: 399, category: 'Accessories', city:'Roma',
                 name: "Dell XPS", price: 599, category: 'Laptop', city:'Roma',
                 name: "MacBook Pro", price: 899, category: 'Laptop', city:'Roma',
                 name: "Pencil Box", price: 6, category: 'Stationary', city:'Barselona',
                 name: "Pen", price: 2, category: 'Stationary', city:'Milano',
                 name: "USB Cable", price: 7, category: 'Accessories', city:'Milano',
                 name: "Eraser", price: 2, category: 'Stationary', city:'Roma',
                 name: "Highlighter", price: 5, category: 'Stationary', city:'Roma'
            ]

        ),

              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.city.indexOf(this.city))
            ,

            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)
            ,

            uniqueCheck(e)
            this.city = [];
            if (e.target.checked) 
                 this.city.push(e.target.value);
               
         ,

            resetOptions:function()
                this.category='',
                this.city='',
                this.name='',
                this.range='1000'
            ,
        ,


</script>

<style>

</style>

但我还希望有多个复选框过滤器,例如,如果我检查了城市“巴塞罗那”和“罗马”,我想向我展示城市的巴塞罗那和罗马的产品。此代码将不起作用,因为@change 函数,我尝试没有它,但结果是当我单击第二个复选框时我什么也没得到

我怎样才能在这里也有那个过滤器?

【问题讨论】:

【参考方案1】:

您的 filterProductsByCity 方法不正确。

它应该检查产品的城市是否列在您的this.city 属性中。

当您选中复选框时,它会将它们的值添加到 city 属性中:

例如:['barcelona', 'montreal']

因此您可以执行以下操作:

filterProductsByCity: function(products) 
    return products.filter(product => this.city.indexOf(product.city) !== -1)

【讨论】:

这很好用,但这是一个问题,它现在默认显示产品列表,只有在点击时才会显示。我可以使用默认选中的复选框来解决这个问题,但我想默认显示列表,当用户选中复选框时,我希望使用过滤功能更新列表

以上是关于Javascript - 如何在 Vue.js 中使用多个复选框进行过滤?的主要内容,如果未能解决你的问题,请参考以下文章

如何从模板 vue.js 2 调用 javascript?

如何设置我的 Vue.js 站点以在每次热重载事件时清除浏览器的 Javascript 控制台?

Vue.js是如何做到数据响应的?

Vue js CLI 2导入并使用javascript插件

在 Vue 中如何使用 JSX,就这么简单!建议收藏

在 Vue 中如何使用 JSX,就这么简单!建议收藏