使用Vue.js过滤列表

时间:2017-01-22 13:29:19

标签: javascript vue.js

我刚刚开始使用Vue.js,这就是我正在做的事情:我正在渲染产品列表,每个产品都有namegender和{{1 }}。我希望用户能够按性别过滤产品,方法是使用输入来输入性别。

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

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

我该如何处理这个问题?

4 个答案:

答案 0 :(得分:58)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

只需修改 @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

答案 3 :(得分:0)

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;
            }
          });
        }
      }

然后您可以遍历filterItems之类的

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