表头搜索
点击查看 → vue el-table 表头搜索(筛选)功能 实现分析(零)
父组件调用
data () {
return {
headerData: [
{
label: '机构编号',
prop: 'orgCode',
seach: true,
seachSetting: {
type: 'Input',
value: ''
}
},
{
label: '机构名称',
prop: 'orgName',
seach: true,
seachSetting: {
type: 'Input',
value: ''
}
},
{
label: '项目数量上限',
prop: 'projectUperLimit',
seach: true,
seachSetting: {
type: 'Input',
value: ''
}
},
{
label: '有效期/年',
prop: 'period',
seach: true,
seachSetting: {
type: 'Input',
value: ''
}
},
{
label: '使用开始时间',
prop: 'useDateStart',
seach: true, // 带搜索就为true,写上下方seachSetting对象(有搜索必写),不要表头搜索可以直接不写此行和seachSetting配置
seachSetting: { // 表头搜索的配置项
type: 'SingleDateTimePicker', // Input为输入框;Range为区间输入;Cascader为级联选择器;DatePicker年月日区间;TimePicker时分秒区间;DateTimePicker年月日时分秒区间
value: '', // 搜索框的值,必填!一般都用value;只有Range区间使用下面的最大值和最小值,不用value
// value: [], // 只在Cascader级联搜索时使用
// minVal: '', // 只在Range区间时使用
// maxVal: '', // 只在Range区间时使用
rename: 'minVal' // 修改搜索条件传给后台的名称
}
},
{
label: '使用结束时间',
prop: 'useDateEnd',
seach: true, // 带搜索就为true,写上下方seachSetting对象(有搜索必写),不要表头搜索可以直接不写此行和seachSetting配置
seachSetting: { // 表头搜索的配置项
type: 'SingleDateTimePicker', // Input为输入框;Range为区间输入;Cascader为级联选择器;DatePicker年月日区间;TimePicker时分秒区间;DateTimePicker年月日时分秒区间
value: '', // 搜索框的值,必填!一般都用value;只有Range区间使用下面的最大值和最小值,不用value
// value: [], // 只在Cascader级联搜索时使用
// minVal: '', // 只在Range区间时使用
// maxVal: '', // 只在Range区间时使用
rename: 'maxVal' // 修改搜索条件传给后台的名称
}
}
],
}
},
methods:{
todoSearch (val) {
console.log('搜索', val)
this.page.pageNum = 1
this.page.pageSize = 10
this.seachForm = JSON.parse(JSON.stringify(val))
this.seachForm.date = {
minVal: val.minVal,
maxVal: val.maxVal
}
delete this.seachForm.minVal
delete this.seachForm.maxVal
this.searchSubmit()
},
clearSearch (val) {
this.page.pageNum = 1
this.page.pageSize = 10
this.seachForm = val
this.searchSubmit()
},
}
}
清除表头查询的方法
this.headerData.forEach(itemHeader => {
this.$refs.edcSearch.clearSearch(itemHeader)
})
附上整个表头搜索的子组件的代码
<template>
<div>
<template v-for="(headerItem, headerIndex) in headerData">
<el-table-column v-if="headerItem.type&&headerItem.type!==''" :label="headerItem.type==='index'?'序号':''" :type="headerItem.type" :width="headerItem.width"></el-table-column>
<el-table-column v-else show-overflow-tooltip :label="headerItem.label" :prop="headerItem.prop" :key="headerIndex" :width="headerItem.width">
<template #header v-if="headerItem.seach">
<el-popover v-if="headerItem.seachSetting.type==='Input'" placement="bottom" trigger="click" width="200" v-model="headerItem.visible">
<el-input autofocus clearable @clear="clearSearch(headerItem)" style="width: 200px" size="small" v-model="headerItem.seachSetting.value" :placeholder="'请输入'+headerItem.label" @keyup.enter.native="todoSearch(headerItem)" />
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value!==''?img2:img1" />
</div>
</el-popover>
<el-popover v-if="headerItem.seachSetting.type==='Range'" placement="bottom" trigger="click" width="250" v-model="headerItem.visible">
<div style="display:flex;align-items:center">
<el-input autofocus clearable @clear="clearSearch(headerItem)" placeholder="最小值" v-model="headerItem.seachSetting.minVal" style="width:108px;" size="small" @keyup.enter.native="todoSearch(headerItem)"></el-input>
<span style="padding:0 10px">至</span>
<el-input autofocus clearable @clear="clearSearch(headerItem)" placeholder="最大值" v-model="headerItem.seachSetting.maxVal" style="width:108px;" size="small" @keyup.enter.native="todoSearch(headerItem)"></el-input>
</div>
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="(headerItem.seachSetting.maxVal&&headerItem.seachSetting.maxVal!=='')||(headerItem.seachSetting.minVal&&headerItem.seachSetting.minVal!=='')?img2:img1" />
</div>
</el-popover>
<el-popover v-if="headerItem.seachSetting.type==='DatePicker'" placement="bottom" trigger="click" width="350" v-model="headerItem.visible">
<el-date-picker v-model="headerItem.seachSetting.value" type="daterange" align="right" unlink-panels key="date-picker" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" @change="todoSearch(headerItem)" :picker-options="pickerOptions">
</el-date-picker>
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value!==''?img2:img1" />
</div>
</el-popover>
<el-popover v-if="headerItem.seachSetting.type==='TimePicker'" placement="bottom" trigger="click" width="350" v-model="headerItem.visible">
<el-time-picker is-range v-model="headerItem.seachSetting.value" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" value-format="HH:mm:ss" @change="todoSearch(headerItem)">
</el-time-picker>
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value!==''?img2:img1" />
</div>
</el-popover>
<el-popover v-if="headerItem.seachSetting.type==='DateTimePicker'" placement="bottom" trigger="click" width="400" v-model="headerItem.visible">
<el-date-picker v-model="headerItem.seachSetting.value" type="datetimerange" align="right" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" @change="todoSearch(headerItem)" :picker-options="pickerOptions">
</el-date-picker>
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value!==''?img2:img1" />
</div>
</el-popover>
<!-- 单独选择时间的 -->
<el-popover v-if="headerItem.seachSetting.type==='SingleDateTimePicker'" placement="bottom" trigger="click" width="220" v-model="headerItem.visible">
<el-date-picker v-model="headerItem.seachSetting.value" type="date" align="center" placeholder="选择日期" @change="todoSearch(headerItem)" format="yyyy-MM-dd" value-format="yyyy-MM-dd"></el-date-picker>
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value!==''?img2:img1" />
</div>
</el-popover>
<!-- -->
<el-popover v-if="headerItem.seachSetting.type==='Cascader'" placement="bottom" trigger="click" width="200" v-model="headerItem.visible" style="position: relative">
<el-cascader clearable ref="cascaderHandle" style="width: 200px" size="small" filterable key="cascader" :options="headerItem.seachSetting.options" v-model="headerItem.seachSetting.value" @change="todoSearch(headerItem)" :props="headerItem.seachSetting.props">
</el-cascader>
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value.length>0?img2:img1" />
</div>
</el-popover>
<el-popover v-if="headerItem.seachSetting.type==='Select'" placement="bottom" trigger="click" width="200" v-model="headerItem.visible" style="position: relative">
<el-select ref="cascaderHandle" style="width: 200px" size="small" filterable key="select" v-model="headerItem.seachSetting.value">
<el-option
v-for="item in headerItem.seachSetting.options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value.length>0?img2:img1" />
</div>
</el-popover>
<el-popover v-if="headerItem.seachSetting.type==='Selects'" placement="bottom" trigger="click" width="200" v-model="headerItem.visible" style="position: relative">
<el-select ref="cascaderHandle" style="width: 200px" size="small" filterable multiple key="select" v-model="headerItem.seachSetting.value">
<el-option
v-for="item in headerItem.seachSetting.options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>
<el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>
<div style="display: flex;align-items: center" slot="reference">
<span class="search-title">{{ headerItem.label }}</span>
<img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value.length>0?img2:img1" />
</div>
</el-popover>
<!-- <el-popover v-if="headerItem.seachSetting.type==='Select'" placement="bottom" trigger="click" width="200" v-model="headerItem.visible" style="position: relative">-->
<!-- <el-cascader clearable ref="cascaderHandle" style="width: 200px" size="small" filterable key="cascader" :options="headerItem.seachSetting.options" v-model="headerItem.seachSetting.value" @change="todoSearch(headerItem)" :props="headerItem.seachSetting.props">-->
<!-- </el-cascader>-->
<!-- <el-button size="small" style="margin-top: 10px;float: left;width: 47%" @click="clearSearch(headerItem)">重 置</el-button>-->
<!-- <el-button size="small" type="primary" style="margin-top: 10px;float: right;width: 47%" @click="todoSearch(headerItem)">搜 索</el-button>-->
<!-- <div style="display: flex;align-items: center" slot="reference">-->
<!-- <span class="search-title">{{ headerItem.label }}</span>-->
<!-- <img style="width: 13px;margin-left: 10px;cursor: pointer" :src="headerItem.seachSetting.value&&headerItem.seachSetting.value.length>0?img2:img1" />-->
<!-- </div>-->
<!-- </el-popover>-->
</template>
<!-- <template slot="header" slot-scope="scope">-->
<!-- <template>-->
<!-- <span class="customize_filter" style="display:inline-block">-->
<!-- <span style="padding-right:3px;">{{headerItem.label}}</span>-->
<!-- </span>-->
<!-- </template>-->
<!-- <template slot-scope="scope">-->
<!-- ...-->
<!-- </template>-->
<!-- </template>-->
</el-table-column>
</template>
</div>
</template>
<script>
export default {
props: ['tableData'],
data () {
return {
seachForm: {},
headerData: [],
img1: require('./image/seachIcon.png'),
img2: require('./image/seachLive.png'),
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick (picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick (picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick (picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
}
}
},
mounted () {
this.$nextTick(() => {
this.first()
})
},
methods: {
first () {
this.headerData = this.tableData
},
todoSearch (headerItem) {
headerItem.visible = false
if (headerItem.seachSetting.type === 'Range') {
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = {
minVal: headerItem.seachSetting.minVal,
maxVal: headerItem.seachSetting.maxVal
}
} else if (headerItem.seachSetting.type === 'Input') {
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = headerItem.seachSetting.value
} else if (headerItem.seachSetting.type === 'DatePicker' || headerItem.seachSetting.type === 'DateTimePicker' || headerItem.seachSetting.type === 'TimePicker') {
console.log('headerItem.seachSetting.value', headerItem.seachSetting.value)
console.log('headerItem.seachSetting.rename', headerItem.seachSetting.rename)
if (headerItem.seachSetting.value == null) {
headerItem.seachSetting.value = ''
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = {
maxVal: '',
minVal: ''
}
} else {
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = {
minVal: headerItem.seachSetting.value[0],
maxVal: headerItem.seachSetting.value[1]
}
}
} else if (headerItem.seachSetting.type === 'SingleDateTimePicker') {
console.log('headerItem.seachSetting.value', headerItem.seachSetting.value)
console.log('headerItem.seachSetting.rename', headerItem.seachSetting.rename)
if (headerItem.seachSetting.value == null) {
headerItem.seachSetting.value = ''
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = ''
} else {
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = headerItem.seachSetting.value
}
} else if (headerItem.seachSetting.type === 'Cascader') {
this.$refs.cascaderHandle[0].dropDownVisible = false
if (headerItem.seachSetting.value && headerItem.seachSetting.value.length > 0) {
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = headerItem.seachSetting.value[headerItem.seachSetting.value.length - 1]
} else {
headerItem.seachSetting.value = []
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = ''
}
} else if (headerItem.seachSetting.type === 'Select') {
if (headerItem.seachSetting.value && headerItem.seachSetting.value.length > 0) {
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = headerItem.seachSetting.value
} else {
headerItem.seachSetting.value = ''
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = ''
}
} else if (headerItem.seachSetting.type === 'Selects') {
if (headerItem.seachSetting.value && headerItem.seachSetting.value.length > 0) {
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = headerItem.seachSetting.value
} else {
headerItem.seachSetting.value = []
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = []
}
}
this.$emit('search', this.seachForm, headerItem)
},
clearSearch (headerItem) {
if (headerItem.seachSetting && headerItem.seachSetting.type) {
headerItem.visible = false
if (headerItem.seachSetting.type === 'Range') {
headerItem.seachSetting.minVal = ''
headerItem.seachSetting.maxVal = ''
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = {
maxVal: '',
minVal: ''
}
} else if (headerItem.seachSetting.type === 'Input') {
headerItem.seachSetting.value = ''
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = ''
} else if (headerItem.seachSetting.type === 'DatePicker' || headerItem.seachSetting.type === 'DateTimePicker' || headerItem.seachSetting.type === 'TimePicker') {
headerItem.seachSetting.value = ''
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = {
maxVal: '',
minVal: ''
}
} else if (headerItem.seachSetting.type === 'SingleDateTimePicker') {
headerItem.seachSetting.value = ''
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = ''
} else if (headerItem.seachSetting.type === 'Cascader') {
this.$refs.cascaderHandle[0].dropDownVisible = false
headerItem.seachSetting.value = []
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = ''
} else if (headerItem.seachSetting.type === 'Select') {
headerItem.seachSetting.value = ''
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = ''
} else if (headerItem.seachSetting.type === 'Selects') {
headerItem.seachSetting.value = []
this.seachForm[headerItem.seachSetting.rename && headerItem.seachSetting.rename !== '' ? headerItem.seachSetting.rename : headerItem.prop] = []
}
this.$emit('clearSearch', this.seachForm)
}
}
}
}
</script>
<style scoped>
</style>