element-ui表格自定义表头——使用下拉模式进行筛选的3种方式

7,902 阅读1分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

方式一、使用 element-ui 的 Table 组件自带的筛选功能来实现

只需要在列中设置 filters 和 filter-method 属性即可开启该列的筛选。filters 是一个数组,filter-method是一个方法,它用于决定某些数据是否显示,会传入三个参数:value, row 和 column。

实现方式如下:

<template>
  <div class="app-container">
    <el-table
      :data="tableData"
      style="width: 100%;"
      border
      height="300"
    >
      <el-table-column
        prop="date"
        label="日期"
        align="center"
        :filters="headerSelect"
        :filter-method="filterHandler"
        :filter-multiple="false"
      />
      <el-table-column
        prop="name"
        label="姓名"
        align="center"
      />
      <el-table-column
        prop="address"
        label="地址"
        align="center"
      />
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }],

      headerSelect: [{
        text: '2016-05-01',
        value: '2016-05-01'
      }, {
        text: '2016-05-02',
        value: '2016-05-02'
      }, {
        text: '2016-05-03',
        value: '2016-05-03'
      }, {
        text: '2016-05-04',
        value: '2016-05-04'
      }]
    }
  },
  methods: {
    filterHandler(value, row, column) {
      const property = column['property']
      return row[property] === value
    }
  }
}
</script>

效果如下:

方式二、使用 element-ui 的 Dropdown 下拉菜单组件来实现

通过组件 slot 来设置下拉触发的元素以及需要通过具名 slot 为 dropdown 来设置下拉菜单。默认情况下,下拉按钮只要 hover 即可,无需点击也会显示下拉菜单,这里我们设置成点击触发(trigger="click")。

实现方式如下:

<template>
  <div class="app-container">
    <el-table
      :data="tableData2"
      style="width: 100%;"
      border
      height="300"
    >
      <el-table-column align="center">
        <template slot="header" slot-scope="scope">
          <el-dropdown trigger="click" @command="handleCommand">
            <span>日期({{ command }})<i class="el-icon-arrow-down el-icon--right" /></span>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item
                v-for="item in headerSelect"
                :key="item.value"
                :command="item.text"
              >
                {{ item.text }}
              </el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </template>
        <template slot-scope="scope">
          <span>{{ scope.row.date }}</span>
        </template>
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        align="center"
      />
      <el-table-column
        prop="address"
        label="地址"
        align="center"
      />
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }],

      headerSelect: [{
        text: '全部',
        value: 'all'
      }, {
        text: '2016-05-01',
        value: '2016-05-01'
      }, {
        text: '2016-05-02',
        value: '2016-05-02'
      }, {
        text: '2016-05-03',
        value: '2016-05-03'
      }, {
        text: '2016-05-04',
        value: '2016-05-04'
      }],

      tableData2: [],
      command: '全部'
    }
  },
  created() {
    this.tableData2 = this.tableData
  },
  methods: {
    handleCommand(command) {
      this.command = command
      if (command === '全部') {
        this.tableData2 = this.tableData
      } else {
        this.tableData2 = this.tableData.filter(item => {
          return item.date.indexOf(command) > -1
        })
      }
    }
  }
}
</script>

效果如下:

方式三、通过自定义 Table 组件的表头来实现

在某一列的表头中嵌套一个下拉框即可,注意这里的【slot-scope="scope"】必须写,否则不生效。

实现方式如下:

<template>
  <div class="app-container">
    <el-table
      :data="tableData2"
      style="width: 100%;"
      border
      height="300"
    >
      <el-table-column align="center">
        <template slot="header" slot-scope="scope">
          <span> 日期 </span>
          <el-select
            v-model="headerSelected"
            @change="headerChanged"
          >
            <el-option
              v-for="item in headerSelect"
              :key="item.value"
              :label="item.text"
              :value="item.value"
            />
          </el-select>
        </template>
        <template slot-scope="scope">
          <span>{{ scope.row.date }}</span>
        </template>
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        align="center"
      />
      <el-table-column
        prop="address"
        label="地址"
        align="center"
      />
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }],

      headerSelect: [{
        text: '全部',
        value: 'all'
      }, {
        text: '2016-05-01',
        value: '2016-05-01'
      }, {
        text: '2016-05-02',
        value: '2016-05-02'
      }, {
        text: '2016-05-03',
        value: '2016-05-03'
      }, {
        text: '2016-05-04',
        value: '2016-05-04'
      }],

      tableData2: [],
      headerSelected: 'all'
    }
  },
  created() {
    this.tableData2 = this.tableData
  },
  methods: {
    headerChanged(val) {
      if (val === 'all') {
        this.tableData2 = this.tableData
      } else {
        this.tableData2 = this.tableData.filter(item => {
          return item.date.indexOf(val) > -1
        })
      }
    }
  }
}
</script>

效果如下: