【问题标题】:VueJs - Table pagination and filterVueJs - 表格分页和过滤器
【发布时间】:2017-09-13 09:35:37
【问题描述】:

我使用Vue2.jsElement UI 作为框架。我希望能够过滤一个切片的表格。为此,我使用了tablefilter 组件,它们的文档可以在here 中找到。

情况正常

表格没有被切片。当你选择一个过滤器时,一个循环会遍历每一行并检查列的值是否等于过滤器。

情况不好

桌子被切片了。当您选择一个过滤器时,一个循环会遍历切片结果的每一行,并检查列的值是否等于过滤器。通过这样做,我们不会过滤“隐藏”值。

我做了一点https://jsfiddle.net/acm3q6q8/3/,这样更容易理解。

所有这些都是有道理的,因为我不是在处理整个数据,而是在切片版本上。

一种解决方案可能是通过对数据进行切片来隐藏行而不是排除它们,但我想知道是否有更好的解决方案?

我想要达到的目标

  • jsfiddle 中,仅显示 2 项。
  • 过滤tag 以仅显示标记为Office 的行

实际结果

没有显示任何行,因为tag 为 office 的行不是切片表的一部分。

预期结果

过滤时,我想考虑不一定显示的行。

重要

这应该适用于多个过滤器(即我选择多个标签)

编辑

同样的,如果你想按字母顺序对名字进行排序,如果你只显示 2 项,Albert 将不会显示。

【问题讨论】:

  • 标签过滤器似乎不适用于那个小提琴。
  • 是的。如果您显示所有项目,一切都很好。一旦您开始对表进行切片,它只会过滤切片的表,而不是整个表。
  • 我的意思是,当我选择一个标签时,什么也没有发生。 filterTag 永远不会被调用。
  • 它确实对我有用。我在filterTag 中添加了console.log。你能再检查一下吗?
  • 标签没问题,你应该选择Confirm“Office”来过滤行(点击标签选择下的左中文单词)。

标签: javascript vue.js vuejs2


【解决方案1】:

问题是切片是在过滤之前完成的。过滤器必须看到原始数据,并且行计数必须是过滤的一部分。

由于过滤器一次只查看一行,因此跟踪匹配的行有点棘手。我在这里所做的是保留一个匹配行的计数器,当正在查看的行是第一行数据时重置为零。这是hacky,但它有效。可能有更好的方法;我不熟悉表格小部件。

var Main = {
    data() {
      return {
      	numberItemToShow : 4,
        tableData: [{
          name: 'One',
          tag: 'Home'
        }, {
          name: 'Two',
          tag: 'Home'
        }, {
          name: 'Three',
          tag: 'Home'
        }, {
          name: 'Four',
          tag: 'Office'
        }],
        scratchCounter: 0
      }
    },
    methods: {
      filterTag(value, row) {
        const matched = row.tag === value;

        if (row === this.tableData[0]) {
        	this.scratchCounter = 0;
        }
        if (matched) {
        	++this.scratchCounter;
        }
        return this.scratchCounter <= this.numberItemToShow && matched;
      }
    }
  }
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')
@import url("//unpkg.com/element-ui/lib/theme-default/index.css");
<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/element-ui/lib/index.js"></script>
<div id="app">
<template>
<input v-model="numberItemToShow" placeholder="edit me">
<p>Number of item to display: {{ numberItemToShow }}</p>
  <el-table :data="tableData" border style="width: 100%">
    <el-table-column prop="name" label="Name">
    </el-table-column>
    <el-table-column prop="tag" label="Tag" :filters="[{ text: 'Home', value: 'Home' }, { text: 'Office', value: 'Office' }]" :filter-method="filterTag">
      <template scope="scope">
        <el-tag :type="scope.row.tag === 'Home' ? 'primary' : 'success'" close-transition>{{scope.row.tag}}</el-tag>
      </template>
    </el-table-column>
  </el-table>
</template>
</div>

【讨论】:

    【解决方案2】:

    您可以处理表格组件上的filter-change 事件(记录在here),并自己过滤/切片。

    var Main = {
        data() {
          return {
            numberItemToShow : 4,
            tableData: [...],
            filter: []
          }
    
        },
        computed : {
          filterData() {
              if (!this.filter.length)
                return this.tableData.slice(0, this.numberItemToShow)
              else
                return this.tableData
                  .filter(row => this.filter.includes(row.tag))
                  .slice(0, this.numberItemToShow);
          }
        },
        methods: {
          onFilterChange(filters){
            if (filters.tag)
                this.filter = filters.tag;
          }
        }  
    }
    

    还有模板

    <template>
    <input v-model="numberItemToShow" placeholder="edit me">
    <p>Number of item to display: {{ numberItemToShow }}</p>
      <el-table ref="tab" :data="filterData" border style="width: 100%" @filter-change="onFilterChange">
        <el-table-column prop="name" label="Name"   sortable>
        </el-table-column>
        <el-table-column prop="tag" label="Tag" column-key="tag" :filters="[{ text: 'Home', value: 'Home' }, { text: 'Office', value: 'Office' }]">
          <template scope="scope">
            <el-tag :type="scope.row.tag === 'Home' ? 'primary' : 'success'" close-transition>{{scope.row.tag}}</el-tag>
          </template>
        </el-table-column>
      </el-table>
    </template>
    

    Example.

    【讨论】:

    • 不过有一个奇怪的错误。打开你的例子。将项目数更改为2。激活Office tag filter 并单击箭头对名称进行排序。
    • @Leo 我对此没有任何解释。似乎该组件以某种方式使用了一些缓存数据。这是一个修复。它监听sort-change 事件并强制计算更新。 jsfiddle.net/yw18so9z/3
    • 我尝试了新的小提琴,但问题仍然存在。
    • 效果很好。谢谢你。我有最后一个问题,因为我注意到另一个问题。 jsfiddle.net/7t8o249g。如果要按年龄排序并且仅显示两个项目。将在这两项而不是整个数据之间进行排序。我该如何处理并将排序应用于整个数据表而不是显示的内容?
    • @Leo 因为你希望以你想要的方式限制行,本质上你必须管理控制给你的一些东西(看起来很奇怪,它没有给你能力限制显示的行,但无论如何)。在这种情况下,您还必须处理排序。他们似乎有一个分页控件,但它似乎根本没有集成到表格控件中。无论如何,这是一个处理排序的更新小提琴。 jsfiddle.net/7t8o249g/1
    猜你喜欢
    • 2016-06-11
    • 2018-03-08
    • 2016-07-01
    • 1970-01-01
    • 2019-10-13
    • 2015-08-12
    • 2019-08-17
    • 2012-08-28
    • 2014-02-03
    相关资源
    最近更新 更多