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
Filter list with Vue.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
回答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

