[英]Create multiple dynamic select filters based on an array with unique values to filter another array in Vue.js
我目前是Vue.js的新手,这是我在堆栈上遇到的第一个问题,如果我不太清楚,请原谅我。
我正在尝试创建多个动态选择过滤器,以过滤我使用axios从api获取的列表。
我已经在HTML模板中显示了数据,并设法创建了两个过滤器,我的主要问题是我需要过滤器仅显示唯一值(没有重复值),而这正是我在努力的地方。
这主要是工作概念的证明,其中显示了一组用户名,标签和位置。 我们以前使用angularjs的地方,现在正在寻求转移到Vue.js,所以我还没有掌握它,由于我不了解如何使一个源数据数组中的信息过滤另一个信息,目前我感到很困惑。源数据数组。
这是我当前在app.js中拥有的内容
new Vue({
el: "#vueApp",
data: {
users: [],
JobRole: '',
Label: '',
search: '',
JobRoles: [],
},
created: function() {
this.getResults();
},
methods: {
getResults: function() {
var vm = this;
axios.get("APIData").then(function(response) {
console.log(response.data.value);
vm.users = response.data.value;
})
},
filterPosition:function() {
var vm = this;
vm.item.Position = event.target.value;
},
filterLabel:function() {
var vm = this;
vm.item.Meta.Label = event.target.value;
}
},
computed: {
JobRoleList: function(){
var vm = this;
var JobRoles = [];
vm.users.forEach(function(item){
if(!JobRoles.includes(item.Position)){
JobRoles.push(item.Position);
console.log(JobRoles);
}
});
return JobRoles;
},
filterAll: function(){
var vm = this;
var filtered = vm.users;
// var JobRoles = vm.JobRoles;
if (vm.search) {
filtered = vm.users.filter(function(item){
return item.People.Title.indexOf(vm.search) > -1
});
}
if (vm.Label) {
filtered = filtered.filter(function(item){
return item.Meta.Label.match(vm.Label)
});
}
if (vm.JobRole) {
vm.JobRole = filtered.filter(function(item){
return item.Position.match(vm.JobRole)
console.log(JobRole);
});
}
return filtered
console.log(filtered);
},
}
});
这是我的标记
<div id="vueApp">
<div>
<select v-model="JobRole">
<option value="">Select a Position</option>
<option v-for="item in JobRoleList" :value="item.Position">{{item}}</option>
</select>
<select v-model="Label">
<option value="">Select a Label</option>
<option v-for="item in filterAll" :value="item.Meta.Label">{{item.Meta.Label}}</option>
</select>
<input type="text" v-model="search" placeholder="Search...">
<table>
<tr>
<th>Name</th>
<th>Department</th>
<th>Position</th>
<!-- <th>People Title</th> -->
</tr>
<tr v-for="item in filterAll">
<td>{{item.People.Title}}</td>
<td>{{item.Meta.Label}}</td>
<td>{{item.Position}}</td>
</tr>
</table>
</div>
</div>
因此,我要讲的是让每个过滤器具有唯一的值而不重复,并过滤列表中的信息。
我已经设法为JobRoleList下的一个选择过滤器创建了一个唯一的值数组,我只需要知道如何使其与filterAll数组进行通信,如果我可以进入那个阶段,那么我要做的就是复制那个用于其他过滤器。
我将不胜感激,并且乐于提供更多细节。
您的代码存在一些问题:
JobRoleList
变量是字符串数组时,您的代码将显示:value="item.Position"
。 因此,当您单击“选择”时,“ JobRole
将没有值 <select v-model="JobRole">
<option value="">Select a Position</option>
<option v-for="item in JobRoleList" :value="item.Position">{{item}}</option>
</select>
jobRole
部分的filterAll
计算变量中过滤了错误的变量 if (vm.JobRole) {
vm.JobRole = filtered.filter(function(item){
return item.Position.match(vm.JobRole)
console.log(JobRole);
});
// This should say "filtered =" not "vm.JobRole ="
}
使用ES6获取唯一值列表的方法也更加简洁:
JobRoleList: function({ users }) {
return [...new Set(users.map(d => d.Position))];
}
您还可以在匹配之前搜索所有小写字母,以改善用户体验。
filtered = users.filter(function(item){
return item.People.Title.toLowerCase().indexOf(search.toLowerCase()) > -1
});
我已经用一个可运行的演示制作了一个Codepen: https ://codepen.io/CodingDeer/pen/abomBXP
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.