使用 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"
【讨论】:
像魅力一样工作!我正在使用基于<select>
值的简单过滤器。在这种情况下,您的解决方案是最好的!谢谢。
请注意,这违反了风格指南。如果使用 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 过滤列表的主要内容,如果未能解决你的问题,请参考以下文章