el-table filter 实现多字段筛选联动功能

1、按照el-table的filter使用方法绑定所有支持筛选的列,利用changeKey触发表格数据的变动,利用deptChangeKey、applyUserChangeKey触发过滤器的变动

      <el-table ref="longProcessTable" :key="changeKey" @filter-change="tableFilter" :class="isFilter ? 'filter-table long-process-table-white' : 'long-process-table-white'" :data="longProcessList">
        <el-table-column prop="applyUser" label="申请人" :key="applyUserChangeKey" :filters="applyUserFilters" :filter-multiple="true" column-key="applyUser"></el-table-column>
        <el-table-column prop="dept" label="归属部门" :key="deptChangeKey" :filters="deptFilters" :filter-multiple="true" column-key="dept"></el-table-column>
      </el-table>

2、在查询数据后,暂存查询到的数据并生成初始的筛选过滤器


    // 以下get调用方式仅供参考,可以根据你的实际使用情况进行修改
    // 关键点在于你接口调用成功后,需要将数据赋值到longProcessList中
    this.$axios.get('xxxxx').then(res=> {
        this.longProcessList = body.dataList
        // 将查询的数据暂存起来作为中间态
        this.tempLongProcessList = this.longProcessList
        // 根据查询后的数据生成初始筛选过滤器
        this.getFiltersData(this.longProcessList, 'deptFilters', 'dept')
        this.getFiltersData(this.longProcessList, 'applyUserFilters', 'applyUser')
    })

3、 封装的filter-change绑定的tableFilter函数

      tableFilter (filters) {
        console.log('filters', filters)
        switch (Object.keys(filters)[0]) { // 根据过滤器filter传的column-key来判断谁调用commonFilter方法
          case 'applyUser': this.commonFilter('applyUser', filters)
          break
          case 'dept': this.commonFilter('dept', filters)
          break
        }
      },
      commonFilter (type, filters) {
        let key
        for (let index in filters) { // filters是筛选对应的column-key的值
          key = index
        }
        this[key] = filters[key]
        console.log('this[key]', this[key],  this[key].length)
        if (this[key].length > 0) { // T1 如果勾选了筛选值
          this.isFilter = true
          this.longProcessList.forEach(item => { // T1.1 根据筛选值到表格渲染的数据中进行匹配 将匹配成功的数据push到resultDataArray中
            this[key].forEach(ele => {
              if (item[type] === ele) {this.resultDataArray.push(item)}
            })
          })
          console.log('this.resultDataArray', this.resultDataArray)
          this.longProcessList = this.resultDataArray // T1.2 将resultDataArray渲染到表格
          this.changeKey = !this.changeKey // T1.3 通过控制表格的key触发表格的数据变化
          this.getFiltersData(this.longProcessList, 'applyUserFilters', 'applyUser') // T1.4 根据表格展示的数据重新匹配新的筛选项
          this.getFiltersData(this.longProcessList, 'deptFilters', 'dept') // T1.5 根据表格展示的数据重新匹配新的筛选项
        } else { // T2没有勾选筛选值直接点击确定,或者使用了重置功能
          this.isFilter = false
          this.longProcessList = this.tempLongProcessList // T2.1恢复最开始的默认数据
          this.getFiltersData(this.longProcessList, 'applyUserFilters', 'applyUser') // T2.2 根据表格展示的默认数据重新匹配新的筛选项
          this.getFiltersData(this.longProcessList, 'deptFilters', 'dept') // T2.3 根据表格展示的默认数据重新匹配新的筛选项
        }
        this.resultDataArray = [] // 每一次筛选结束都要清空resultDataArray,否则会导致resultDataArray中数据叠加
      },
      // 生成filters过滤器数据
      getFiltersData (arr, filterName, type) {
        this[filterName] = []
        arr.forEach(item => {
          this[filterName].push({text: item[type], value: item[type]})
        })
        this[filterName] = this.uniqueObjectInArray(this[filterName])
      },
      // 数组中的对象去重
      uniqueObjectInArray (arr) {
        let map = new Map()
        return arr.filter((item) => !map.has(item.value) && map.set(item.value, item))
      },

3、需要watch监听两个筛选过滤器,并利用key值(deptChangeKey、applyUserChangeKey)的变动,才能触发过滤器的实时更新

    watch: {
      deptFilters (nv, ov) {
        this.deptFilters = nv
        this.deptChangeKey = !this.deptChangeKey
      },
      applyUserFilters (nv, ov) {
        this.applyUserFilters = nv
        this.applyUserChangeKey = !this.applyUserChangeKey
      }
    }

4、问题集合

(a)由于key的改变会使表格和过滤器不断刷新,从而导致进行了筛选操作但是筛选器图标并未着色,这就用到了el-table头部使用的isFilter。

isFilter为true则进行了筛选操作,table就多一个类名filter-table(类样式如下);isFilter为false则未进行筛选操作或已重置则table保留初始类名long-process-table-white。完美解决着色问题!

      .filter-table th .bk-table-column-filter-trigger {
        color: #63656e;
      }

(b)如果想要通过点击查询/重置/页码分页等来实现过滤器的筛选值重置,可利用table的ref属性,代码如下 :(这个问题若没有出现则不需要使用此代码)

        if (this.$refs.longProcessTable) {
          this.applyUser = []
          this.dept = []
          this.isFilter = false
        }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你在使用 Element UI 的 el-table 组件,并且想要自定义排序字段名字,可以通过使用 scoped slots 中的 header 自定义表头内容,然后在其中定义排序字段名字。 例如,如果你的数据中有一个名为 name 的字段,但是你想要在表格中将其显示为 "姓名",并使用该字段进行排序,你可以这样做: ```html <el-table :data="tableData" :sort-by="'name'"> <el-table-column prop="name" label="姓名"> <template slot="header"> <span @click="changeSort('name')">姓名</span> </template> </el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> ``` 在上面的代码中,我们使用了 `:sort-by="'name'"` 来指定使用 name 字段进行排序。然后在姓名表头的 scoped slot 中,我们定义了一个 `changeSort` 方法来切换排序方向,并将排序字段名字设为 "name"。 你可以根据自己的需要修改代码中的字段名字和表头显示内容。 ### 回答2: 在使用Element UI的el-table组件进行表格展示时,可以通过自定义排序名字字段实现对数据的排序功能。 首先,在el-table的columns配置中,通过设置sortable属性为true,将该字段设置为可排序的。例如: ```html <el-table :data="tableData" border> <el-table-column prop="name" label="姓名" sortable></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> ``` 其中,prop属性指定了数据对象中对应的字段,label属性用于显示表头的名称。通过给姓名字段el-table-column添加sortable属性,即可实现对该字段的排序。 接着,在Vue实例中,可以使用自定义的排序方法对姓名字段进行排序。例如,在data中定义一个sortMethod方法来处理排序逻辑: ```javascript data() { return { tableData: [ { name: '张三', age: 18 }, { name: '李四', age: 20 }, { name: '王五', age: 22 }, ] }; }, methods: { sortMethod(a, b) { return a.localeCompare(b); // 使用localeCompare方法进行字符串的排序 } } ``` 最后,将sortMethod方法通过升序(ascending)或降序(descending)排序传递给el-table的sort-method属性,即可实现对姓名字段的自定义排序。 ```html <el-table :data="tableData" border> <el-table-column prop="name" label="姓名" sortable :sort-method="sortMethod"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> ``` 这样,点击姓名表头便可以根据自定义的排序方法对姓名字段进行排序了。通过以上步骤,就可以实现el-table组件的自定义排序名字字段功能。 ### 回答3: 在el-table中自定义排序名字字段可以通过使用自定义排序函数来实现。首先,在el-table-column标签中添加sortable属性,并设置为custom。然后,在该标签中添加一个scoped-slot,命名为sort-method,用于指定排序的规则。 例如,我们要按照名字的长度进行排序,可以这样写: ``` <el-table-column prop="name" label="名字" sortable="custom"> <template slot-scope="scope"> {{scope.row.name}} </template> <template slot="sort-method" slot-scope="scope"> {{scope.$index}} <!-- 自定义排序函数 --> {{scope.store.data.sort((a, b) => a.name.length - b.name.length)}} </template> </el-table-column> ``` 在sort-method slot中,scope参数包含了访问原始数据、排序方法等信息。我们可以使用scope.store.data来访问原始数据,并使用sort方法对数据进行排序。在这个例子中,我们通过获取名字字段的长度来进行排序。 当你在el-table中点击名字列的表头时,el-table会调用我们定义的sort-method函数对数据进行排序,然后渲染表格。 希望这个回答能满足你的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值