【问题标题】:Filter list with Vue.js使用 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" 

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

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

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

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

    const app = new Vue({
    
      el: '#app',
    
      data: {
         search: '',
         items: [
           {name: 'Stackoverflow', 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

    【讨论】:

    【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 2021-04-13
        • 2016-05-29
        • 1970-01-01
        • 2016-12-14
        • 2016-06-17
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多