繁体   English   中英

基于具有唯一值的数组创建多个动态选择过滤器,以过滤Vue.js中的另一个数组

[英]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数组进行通信,如果我可以进入那个阶段,那么我要做的就是复制那个用于其他过滤器。

我将不胜感激,并且乐于提供更多细节。

您的代码存在一些问题:

  1. 您将错误的值绑定到作业角色选择。 现在,当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>
  1. 您在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM