【问题标题】:Filtering list by two or more selects in Vue.js 2.0在 Vue.js 2.0 中通过两个或多个选择过滤列表
【发布时间】:2017-03-08 23:31:05
【问题描述】:

由于在 Vue 2.0 中,您不能再将多个管道过滤器链接到一个列表(|filterBy 等),如果您有两个或更多选择下拉列表,您应该如何在计算属性中执行此操作?

我希望能够按专辑标题(从选择 1)和按年份(选择 2)排序。

<select v-model="albumFilter">
    <option value="All">All</option>
    <option value="Album 1">Album 1</option>
    <option value="Album 2">Album 2</option>
    <option value="Album 3">Album 3</option>
</select>

<select v-model="yearFilter">
    <option value="Year">Year</option>
    <option value="2017">2017</option>
    <option value="2016">2016</option>
    <option value="2015">2015</option>
</select>

<ul>
    <li v-for="review in filterByAlbum" v-if="review.type === 'recordReview'">
        <a :href="review.jsonUrl">
            [[ review.title ]]
        </a>
    </li>
</ul>

Vue js 代码:

data() {
    return {
        pressEntries: [],
        albumFilter: 'All',
        yearFilter: 'Year'
    }
},

filterByAlbum: function() {

    // Select 1 (Album Filter)
    switch (this.albumFilter) {
        case 'All':
            return this.pressEntries;
            break;

        case 'Neither':
            return this.pressEntries.filter(entry => {
                return entry.relatedRecording === null
            });
            break;

        default:
            return this.pressEntries.filter(entry => {
                return entry.relatedRecording === this.albumFilter
            });     
    }

    // Select 2 (Year Filter)
    if (this.yearFilter === 'Year') {
        return this.pressEntries;
    }
    else {
        return this.pressEntries.filter(entry => {
            let postDate = new Date(entry.postDate.date);
            return JSON.stringify(postDate.getFullYear()) === this.yearFilter;
        });
    }
}

pressEntries 数据模型从 API 获取数据,我没有费心为其添加代码。每个选择过滤器的每个代码块都单独工作,但不能一起工作。

如果v-for 循环中的filterByAlbum 引用了计算属性,然后又引用了pressEntries 数据模型,那么是否有可能有两个v-for 运行的计算属性(如“ filterByAlbum" 和 "'filterByYear`" 例如)?还是我需要弄清楚如何过滤一个海量计算属性中的所有结果?

【问题讨论】:

    标签: javascript vuejs2


    【解决方案1】:

    这是我的解决方案: 您可以轻松添加 3 选择框

    https://codepen.io/anon/pen/PjOoEN

    function() {
        var vm = this;
        var category = vm.selectedCategory;
        var gender = vm.selectedGender;
    
        if(category === "All" && gender === "All") {
            return vm.people;
        } else {
            return vm.people.filter(function(person) {
                return  (category === 'All' || person.category === category) && (gender === 'All'  || person.gender === gender);     
            });
        }
    }
    

    【讨论】:

    • 嗨,如果我想计算显示项目。怎么做 ?谢谢
    【解决方案2】:

    这是一个可行的计算示例。您也可以将albumFilteryearFilter 移动到它们自己的方法中。基本上使用这种技术,您可以根据需要将任意数量的过滤器组装在一起。

    function filterByAlbum(){
    
      const albumFilter = entry => 
               (this.albumFilter == 'All') || 
               (this.albumFilter == 'Neither' && !entry.relatedRecording) ||
               (entry.relatedRecording === this.albumFilter);
    
      const yearFilter = entry => 
             (this.yearFilter == 'Year') || 
             (new Date(entry.postDate.date).getFullYear() == this.yearFilter);
    
      const reducer = (accumulator, entry) => {
        if (albumFilter(entry) && yearFilter(entry))
          accumulator.push(entry);
        return accumulator;
      }
    
      return this.pressEntries.reduce(reducer, []);
    }
    
    new Vue({
      el: "#app",
      data() {
        return {
            pressEntries,
            albumFilter: 'All',
            yearFilter: 'Year'
        }
      },
      computed:{
        filterByAlbum
      }
    })
    

    我不得不猜测您的数据结构,但这里是 working example

    【讨论】:

    • 嗨,如果我想计算显示项目。怎么做 ?谢谢
    • @KemBardly 你的意思是要计算从过滤器中出来的项目吗?
    • 是的,我想做分页,请帮忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2016-04-03
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多