Javascript 使用 Vue.js 过滤列表

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/41791482/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 00:38:25  来源:igfitidea点击:

Filter list with Vue.js

javascriptvue.js

提问by Graham Slick

I just got started with Vue.js and here is what I'm doing: I am rendering a list of products, and each product has a name, a genderand a size. I'd like users to be able to filter products by gender, by using an input to type the gender.

我刚开始使用 Vue.js,这就是我正在做的事情:我正在渲染一个产品列表,每个产品都有一个name、agender和一个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">

I managed to get the gender updated, but I have an issue with the filtering part. When the page loads, I don't want any filtering. In the documentation, they advise to use v-ifbut it doesn't seem compatible with this configuration.

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

If I use v-if, I could do:

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

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

But again, this doesn't work when the page load because gender is empty. I couldn't find a workaround for this.

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

How should I approach this issue ?

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

回答by Belmin Bedak

Use computed properties - something like this (Example bellow filter items by type)

使用计算属性 - 像这样(示例波纹管按类型过滤项目)

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

})

Template:

模板:

  <div id="app">

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

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

  </div>

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

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

回答by Nora

You can try v-if="!gender ||?product.gender == gender"

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

回答by Bakhtawar GIll

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

and then u can iterate through filteredItems like e.g

然后你可以遍历filteredItems,例如

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

回答by Gufran Hasan

Just modified @Nora's answer.

刚刚修改了@Nora的答案。

You need to change in the template as:

您需要在模板中更改为:

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

and in JS file as:

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

Working Demo: https://jsbin.com/qocuraquki/edit?html,js,console,output

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