大家好呀,珊妹儿最近更新的有点慢了,是因为最近疏于学习,工作也是没接触到一些新的技术,但近期由于工作使用了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的输入也不会及时响应,如果有大佬可以解决这个问题,还望提供解决方案

具体代码如下:

<el-table-column
        v-for="(column, index) in columns"
        :key="column.name"
        :prop="column.prop"
        :label="column.label"
        :show-overflow-tooltip="true"
        scoped-slot
      >
      <template slot="header">
          <span>{{column.label}}</span>
          <el-select
            v-if="column.type == 'select'"
            placeholder="请选择"
            clearable
            v-model="filterinput[column.prop]"
            @change="handleTableColumnInputChange()"
          >
            <el-option
              v-for="item in column.options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
           <el-date-picker
            v-else-if="column.type == 'date'"
            type="daterange"
            v-model="filterinput[column.prop]"
            style="width: 100%"
            placeholder="选择日期"
            format="yyyy/MM/dd"
            value-format="yyyy/MM/dd"
            clearable
            range-separator= "至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            @change="handleTableColumnInputChange()"
          >
          </el-date-picker>
          <el-input
            v-else-if="column.type == 'input'"
            size="small"
            clearable
            @change="handleTableColumnInputChange()"
            v-model="filterinput[column.prop]"
          ></el-input>
      </template>
        <template slot-scope="scope">
            <span>{{scope.row[column.prop]}}</span>
        </template>
      </el-table-column>

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

Logo

前往低代码交流专区

更多推荐