javascript - 如何在 VueJS 中创建多个商店过滤器?

标签 javascript html vue.js

我是 VueJS 新手,这是我的第一个大项目。在这个项目中,我的元素有 2 个过滤器,一个是搜索栏,另一个基于复选框。正如您在我的代码中看到的,我有一个带有两个过滤器的计算属性,第二个过滤器应该显示具有相同品牌的产品,但它不起作用,我不知道为什么。如果有人有想法那就太酷了;)

<div class="col-xs-12">
    <input type="text" v-model="search" placeholder="Rechercher" class="search">
</div>
<div class="row">
    <a href="#" v-on:click="show = !show" class="filter col-xs-3">+ filtres</a>
    <transition name="fade">
        <div v-if="show" class="filter__container">
            <ul>
                <li>
                    <input type="checkbox" v-model="getBrand" v-on:click="filtered" v-bind:value="brand" />
                    <label for="apple">Apple</label>
                </li>
                <li>
                    <input type="checkbox" v-model="getBrand" v-on:click="filtered" v-bind:value="brand" />
                    <label for="samsung">Samsung</label>
                </li>
            </ul>
        </div>
    </transition>
</div>
<div class="row between-xs no-margin grid">
    <div v-for="product in filtered" class="containers no-padding no-margin item">
        <router-link to="/items">
            <div @click="getProduct(product)">
                <img :src="product.img" :alt="product.alt" class="img">
                <div class="content">
                    <h3>{{ product.title }}</h3>
                    <p>{{ product.description }}</p>
                    <p>{{ product.brand }}</p>
                </div>
            </div>
        </router-link>
    </div>
</div>

<script>
import app from '../App'
import {mapActions} from 'vuex';

export default {
    components: {
        app
    },
    data() {
        return {
            show: false,
            search: '',
            brand: ['apple','samsung'],
            getBrand:[],
        }
    },
    computed: {
        products() {
            return this.$store.state.products;
        },
        filtered: function () {
            return this.products.filter((product) => {
                return product.title.toLowerCase().match(this.search.toLowerCase())
                return product.brand.match(this.getBrand.includes(brand))
            })
        },
    },
    methods: {
        ...mapActions([
            'currentProduct',
        ]),
        getProduct(product) {
            this.currentProduct(product);
        }
    },
};
</script>

export const store = new Vuex.Store({
  state: {
    products: [{
        img: '../icons/img.png',
        alt: 'logo',
        title: 'Title',
        description: 'Description',
        brand: 'Apple'
      },
      {
        img: '../icons/img.png',
        alt: 'logo',
        title: 'Title2',
        description: 'Description2',
        brand: 'Apple'
      },
      {
        img: '../icons/img.png',
        alt: 'logo',
        title: 'Title3',
        description: 'Description3'
        brand: 'Samsung'
      },
      {
        img: '../icons/img.png',
        alt: 'logo',
        title: 'Title4',
        description: 'Description4'
        brand: 'Samsung'
      }
    ],
    currentProduct: {},
  },
  getters: {
    getProduct: state => state.currentProduct,
  },
  mutations: {
    CURRENT_PRODUCT: (state, product) => {
      state.currentProduct = product;
    }
  },
  actions: {
    currentProduct: (context, product) => {
      context.commit('CURRENT_PRODUCT', product);
    }
  }
})

最佳答案

同一个函数不能返回两次。使用 && 链接条件或在另一个对 filter 的调用中链接。

您还滥用了match。参数必须是正则表达式或可以安全地转换为正则表达式的东西。如果您输入像 [ 这样在正则表达式中具有特殊含义的字符,您可以在控制台中看到问题。也许您的意思是包含

第二个条件似乎也不正确。不完全清楚 matchincludes 的组合试图实现什么,但我认为您正在寻找这样的东西:

return this.products.filter((product) => {
    return product.title.toLowerCase().includes(this.search.toLowerCase()) &&
      this.getBrand.includes(product.brand)
})

值得注意的是,虽然这两个条件都使用名为 includes 的方法,但它们是两种不同的方法,一种针对字符串,另一种针对数组。

这似乎也是错误的:

v-bind:value="brand"

brand 是一个字符串数组,您不会使用 v-for 循环它们。将其更改为 value="Apple"value="Samsung",确保大小写与数据匹配。

我还建议删除v-on:click="filtered"。不确定它想要做什么,但它似乎将计算属性视为点击监听器。

关于javascript - 如何在 VueJS 中创建多个商店过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58397467/

相关文章:

javascript - 纯 JS Hangman 中防止重复字母输入的问题

javascript - Html 5 文件系统 API,我收到 DOMError "NotSupporteError"

Vue.js v-for 与 v-model

css - 如何在单击时使用 Vue 来切换/停用事件的 html 类?

javascript - 在另一个函数中使用时变量可能未定义(Typescript“错误 TS2532)

javascript - 无法使用纯 JavaScript 禁用元素的单击事件

javascript - 如何使 jQuery 对话框成为模态?

javascript - 单击图像时如何添加图像

javascript - 制作一个不受 body 类影响的标签

javascript - Update 语句将值设置为 null 而不是主键