一、话不多说 上才艺^_^
二、对于各位大佬来说说多的都是废话,接下来直接上代码
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哈哈~
实在不行联系作者本人(也不一定回复)(*^▽^*)