el-table/elementui 表格组件实现每一列的筛选(两种方法)

大家好呀,珊妹儿最近更新的有点慢了,是因为最近疏于学习,工作也是没接触到一些新的技术,但近期由于工作使用了el-table组件,需求又有个列的筛选,鉴于项目前期使用的jqGrid,大家都知道,这个插件想要实现列的筛选很容易,因为它自己封装好了,直接可以用,但是我们的新功能使用了vue,所以选择了el-table。

        大家应该都知道官网上的筛选,只提供了类似下拉框多选的筛选,如果这一列是日期的话,我们希望是筛选的时候选择的是日期呢,又或者是input框呢?下面看下图就明白了:

el-table/elementui 表格组件实现每一列的筛选(两种方法)_第1张图片

 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的输入也不会及时响应,如果有大佬可以解决这个问题,还望提供解决方案

具体代码如下:


      
        
      

重点注意!!!!!:定义列的时候记得一定要定义个type属性,属性值就是input/date/select

你可能感兴趣的:(前端插件,vue,element-ui,elementui,vue.js,前端,el-table)