大家好呀,珊妹儿最近更新的有点慢了,是因为最近疏于学习,工作也是没接触到一些新的技术,但近期由于工作使用了el-table组件,需求又有个列的筛选,鉴于项目前期使用的jqGrid,大家都知道,这个插件想要实现列的筛选很容易,因为它自己封装好了,直接可以用,但是我们的新功能使用了vue,所以选择了el-table。
大家应该都知道官网上的筛选,只提供了类似下拉框多选的筛选,如果这一列是日期的话,我们希望是筛选的时候选择的是日期呢,又或者是input框呢?下面看下图就明白了:
text类型----需要用el-input
date类型----需要用el-date-picker
select类型---需要用el-select
方法一:
珊妹儿我是这样做的,首先在定义表格列的时候定义每一列的类型(例如type="input"),表格里无非就是三种类型:input,date,select,然后根据官网提供了个方法:render-header,这个里面可以自己定义显示什么,代码如下:
renderHeader(h, { column, $index })
const coltype = column.type;
if (coltype == "select") {
return [
column.label,
h(
"el-select",
{
on: {
input: (value) => {
//这个是下拉框的事件
this.$set(this.filterinput, column.property, value);
},
},
props: { //这里是el-select的属性
value: this.filterinput[column.property], //文字框的内容取决于这个value,如果value不存在,会报错
clearable: true,
},
},
[
columndata.options.map((item) => { //columndata这个是自己的全局
return h("el-option", {
props: {
value: item.value,
label: item.label,
},
});
}),
]
),
];
} else if (coltype == "date") {
return [
column.label,
h("el-date-picker", {
on: {
input: (value) => {
//随着下拉框的不同,文字框里的内容在边
this.$set(this.filterinput, column.property, value);
},
},
props: {
value: this.filterinput[column.property],
clearable: true,
format: "yyyyMMdd",
"value-format": "yyyy/MM/dd",
type: "daterange",
"range-separator": "至",
"start-placeholder": "开始日期",
"end-placeholder": "结束日期",
},
}),
];
} else {
return [
column.label,
h("el-input", {
on: {
input: (value) => {
//这个是input每次改变值的事件
this.$set(this.filterinput, column.property, value);
},
change: () => {
//这个是input改变值后enter事件
this.onFilterChange();
},
},
props: {
value: this.filterinput[column.property],
placeholder: "请输入",
clearable: true,
},
}),
];
}
},
方法二:
使用方法一的时候,浏览器下面会提示建议使用scoped-slot,方法二就是使用scoped-slot实现,但是目前珊妹遇到个问题,就是如果表格的列信息是动态的,循环出来的列,那么表头也会是动态渲染的,这就导致获取到的每个表头筛选的内容并没有getter/setter属性,会导致粘贴不到表头筛选框中,el-input的输入也不会及时响应,如果有大佬可以解决这个问题,还望提供解决方案
具体代码如下:
{{column.label}}
{{scope.row[column.prop]}}
重点注意!!!!!:定义列的时候记得一定要定义个type属性,属性值就是input/date/select