Element Table表格筛选功能二次封装


一、话不多说  上才艺^_^

 

二、对于各位大佬来说说多的都是废话,接下来直接上代码

1.HTML代码 组件

<template>
  <div style="display: flex;align-items: center;flex-wrap: wrap">
    <!-- 是否排序 -->
    <p
      v-if="condition.sortAbled"
      class="div-inBlock"
      style="cursor:pointer;display:inline-block;height:100%;"
      @click.stop="changeOrder(condition,column)"
    >
      <span>{{ condition.title }}</span>
      <span class="caret-wrapper">
        <i
          class="sort-caret ascending"
          :style="{'border-bottom-color':sortOrder === 'asc' ? '#409eff' : '#c0c4cc'}"
        />
        <i
          class="sort-caret descending"
          :style="{'border-top-color':sortOrder === 'desc' ? '#409eff' : '#c0c4cc'}"
        />
      </span>
    </p>
    <p v-else class="div-inBlock">
      <label style="cursor:pointer">{{ condition.title }}</label>
    </p>
    <!-- 是否过滤 -->
    <p v-if="condition.filterAbled" class="div-inBlock">
      <el-popover
        :ref="'filterPanel'+column.id"
        :value="condition.filterPanelVisible"
        placement="bottom"
        width="230"
        trigger="click"
        :visible-arrow="false"
        @show="showPanel(column,true)"
        @hide="showPanel(column,false)"
      >
        <el-input
          v-if="condition.mode==='input'"
          v-model="value"
          size="small"
          :placeholder="condition.title"
          clearable
          class="input-with-select"
          @keyup.enter.native="onFilter('filterPanel'+column.id,column)"
        >
          <el-button slot="append" icon="el-icon-search" @click.stop="onFilter('filterPanel'+column.id,column)"/>
        </el-input>
        <div v-if="condition.multiple">
          <el-select
            v-if="condition.mode==='select'"
            v-model="valueList"
            :placeholder="'请选择'+condition.title"
            clearable
            :multiple="condition.multiple"
            @change="onFilter('filterPanel'+column.id,column)">
            <el-option
              v-for="item in condition.filters"
              :key="item.value"
              :label="item.text"
              :value="item.value">
            </el-option>
          </el-select>
        </div>
        <div v-if="!condition.multiple">
          <el-select
            v-if="condition.mode==='select'"
            v-model="value"
            :placeholder="'请选择'+condition.title"
            clearable
            @change="onFilter('filterPanel'+column.id,column)">
            <el-option
              v-for="item in condition.filters"
              :key="item.value"
              :label="item.text"
              :value="item.value">
            </el-option>
          </el-select>
        </div>
        <el-button
          slot="reference"
          type="text"
          :class="filterIcon"
        />
      </el-popover>
    </p>
  </div>
</template>

2.JS代码 组件

<script>
export default {
  name: 'headerInput',
  props: ['condition', 'column', 'index'],
  data() {
    return {
      value: '',
      valueList: [],
      sortOrder: '',
      columns: {
        sortOrder: 'none'
      },
      filterIcon: 'el-icon-arrow-down',
      isIcon: false,
      indexs: '',
      isMultiple: true
    }
  },
  created() {},
  watch: {},
  methods: {
    changeOrder(condition, column) {
      let destOrder = ''
      switch (this.columns.sortOrder) {
        case 'none':
          destOrder = 'asc'
          break
        case 'asc':
          destOrder = 'desc'
          break
        case 'desc':
          destOrder = 'none'
          break
        default:
          destOrder = 'none'
          break
      }
      this.columns.sortOrder = destOrder
      this.sortOrder = destOrder
      this.$emit('sortChang', {
        prop: column.property,
        order: destOrder === 'asc' ? 'ascending' : destOrder === 'desc' ? 'descending' : null,
        type: true
      })
    },
    onFilter() {
      this.isIcon = true
      if (this.condition.mode === 'select') {
        this.filterIcon = this.isIcon && this.valueList.length > 0 ? 'el-icon-place' : 'el-icon-arrow-down'
      } else {
        this.filterIcon = this.isIcon && this.value ? 'el-icon-place' : 'el-icon-arrow-down'
      }
      this.$emit('inquireFilter', this.condition.multiple ? this.valueList : this.value)
    },
    clearSort(column) {
      this.columns.sortOrder = 'none'
      this.sortOrder = 'none'
    },
    showPanel() {}
  }
}
</script>

3.使用方法

1)Select 选择方式

 <template slot="header" slot-scope="scope">
          <header-input
            :ref="'headerInput'+scope.$index"
            :condition="{title: scope.column.label,//单元格名称
                         prop: scope.column.property, //绑定的字段
                         width: '',
                         required: false, //是否出现“*”
                         cellRender: 'text',
                         mode:'select',// select 为下拉方式 input为输入方式
                         sortAbled: false, //能否排序
                         sortOrder: 'none', //按照哪种方式排序
                         filterAbled: true, //能否过滤
                         filterValue: '',
                         multiple:true, //是否多选 (mode必须是‘select’启用)
                         filters:[{ text: '待审批', value: 1 }, { text: '已审待汇总', value: 2},{ text: '已汇总', value: 3 }], //type 为 select 时使用
                         filterPanelVisible: false}"
            :column="scope.column"
            @sortChang="e=>{sortChange(e,scope.$index)}"
            @inquireFilter="e=>{listQuery.Status=e,handleFilter()}"
          />
  </template>

2)input方式  于Select 选择类似

<template slot="header" slot-scope="scope">
          <header-input
            :ref="'headerInput'+scope.$index"
            :condition="{title: scope.column.label,
                         prop: scope.column.property, //绑定的字段
                         width: '',
                         required: false, //是否出现“*”
                         cellRender: 'text',
                         mode:'input', //select为下拉方式 input为输入方式
                         sortAbled: true, //能否排序
                         sortOrder: 'none', //按照哪种方式排序
                         filterAbled: true, //能否过滤
                         filterValue: '',
                         filterPanelVisible: false}"
            :column="scope.column"
            @sortChang="e=>{sortChange(e,scope.$index)}"
            @inquireFilter="e=>{listQuery.DeliveryCode=e,handleFilter()}"
          />
</template>

2)多选方式 (此方式只进行本地筛选,如想走远程筛选可去看Elemnet官方文档 )

<el-table-column
   label="物流服务商"
   prop="CarrierCompany"
   sortable="custom"
   align="center"
   width="120"
   show-overflow-tooltip
   :filters="filtersList('CarrierCompany',list)"
   :filter-method="(value, row)=>{return row.CarrierCompany === value}"
>
filtersList() 为 计算属性方法 过滤了表格中的数据并进行了去重
computed: {
  filtersList() {
    return function(key, list) {
      // key:字段名  list:数据源
      const data = list.map(item => {
        return {
          text: item[key],
          value: item[key]
        }
      })
      const res = new Map()
      return data.filter(arr => !res.has(arr.value) && res.set(arr.value, 1))
    }
  }
}

三、看不懂的可以看这里了

懒!不想写,,,,看不懂说明你技术不行,去学习一下再来啊O(∩_∩)O哈哈~

实在不行联系作者本人(也不一定回复)(*^▽^*)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM