使用 Vue.js 过滤列表

Posted

技术标签:

【中文标题】使用 Vue.js 过滤列表【英文标题】:Filter list with Vue.js 【发布时间】:2017-06-07 02:02:46 【问题描述】:

我刚刚开始使用 Vue.js,这就是我正在做的事情:我正在渲染一个产品列表,每个产品都有一个 name、一个 gender 和一个 size。我希望用户能够通过使用输入输入性别来按性别过滤产品。

var vm = new Vue(
      el: '#product_index',
      data: 
        gender: "",
        products: [name: "jean1", gender: "women", size: "S", name: "jean2", gender: "men", size: "S"]
      ,
      methods:
        updateGender: function(event)
          this.gender = $(event.target).val()
        
      
    
  )

  <div v-for="product in products" v-if="...">
    <p>product.name<p>
  </div>
  <input v-on:change="updateGender">

我设法更新了性别,但过滤部分有问题。当页面加载时,我不想要任何过滤。在文档中,他们建议使用v-if,但它似乎与此配置不兼容。

如果我使用v-if,我可以这样做:

v-if="product.gender == gender" 

但同样,这在页面加载时不起作用,因为性别为空。 我找不到解决方法。

我应该如何处理这个问题?

【问题讨论】:

【参考方案1】:

使用计算属性 - 类似这样(以下示例按类型过滤项目)

const app = new Vue(

  el: '#app',

  data: 
     search: '',
     items: [
       name: '***', type: 'development',
       name: 'Game of Thrones', type: 'serie',
       name: 'Jon Snow', type: 'actor'
     ]
  ,

  computed: 
    filteredItems() 
      return this.items.filter(item => 
         return item.type.toLowerCase().indexOf(this.search.toLowerCase()) > -1
      )
    
  

)

模板:

  <div id="app">

    <div v-for="item in filteredItems" >
      <p>item.name</p>
    </div>

    <input type="text" v-model="search">

  </div>

演示:http://jsbin.com/dezokiwowu/edit?html,js,console,output

【讨论】:

这是正确的方法。也可以看看官方文档vuejs.org/v2/guide/migration.html#Replacing-the-filterBy-Filter 你好,请检查一下这个问题:***.com/questions/54415053/… 如果我们想同时搜索“类型”和“名称”怎么办? @BakhtawarGIll 在这种情况下,您需要列出要过滤的键,并对每个键执行相同操作。【参考方案2】:

你可以试试v-if="!gender || product.gender == gender"

【讨论】:

像魅力一样工作!我正在使用基于 &lt;select&gt; 值的简单过滤器。在这种情况下,您的解决方案是最好的!谢谢。 请注意,这违反了风格指南。如果使用 Eslint 将显示警告(请参阅here)。【参考方案3】:

刚刚修改了@Nora的回答。

您需要在模板中更改为:

 <div id="product_index">
    <div v-for="product in products" v-if="!gender || product.gender===gender">
      <p>product.name<p>
    </div>
    <input v-on:change="updateGender">
  </div>

在 JS 文件中为:

var vm = new Vue(
      el: '#product_index',
      data: 
        gender: "",
        products: [name: "jean1", gender: "women", size: "S", name: "jean2", gender: "men", size: "S"]
      ,
      methods:
        updateGender: function(event)
          this.gender = event.target.value
        
      
    
  );

工作演示:https://jsbin.com/qocuraquki/edit?html,js,console,output

【讨论】:

【参考方案4】:
computed: 
        filteredItems() 
          return this.allStartupData.filter(item => 
            let byName =
              item.name.toLowerCase().indexOf(this.search.toLowerCase()) > -1;
            let byDescription =
              item.description.toLowerCase().indexOf(this.search.toLowerCase()) >
              -1;
            if (byName === true) 
              return byName;
             else if (byDescription === true) 
              return byDescription;
            
          );
        
      

然后你可以遍历filteredItems,例如

 <v-flex v-for="(obj,index) in filteredItems" :key="index" xs12 md4>

【讨论】:

以上是关于使用 Vue.js 过滤列表的主要内容,如果未能解决你的问题,请参考以下文章

Vue,品牌列表案例(仅添加,删除,搜索,全局过滤器,私有过滤器)

使用 Vue.js、Axios 和 Django 过滤对象

自定义 v-repeat 过滤器 Vue.js

Vue_列表过滤应用

vue.js总结第二天

使用 Vue JS 从数组中过滤数据的最佳方法是啥?