您的位置:

如何优化el-table单选

一、增加单选框可点击区域

在默认情况下,el-table的单选框只有在鼠标移动到表格内容区域时才会出现,这很容易让用户忽略它的存在。

因此,我们可以通过增加单选框的可点击区域来提高用户的使用体验。一种简单的实现方式是,在表格行上添加一个单选框占位符,使用户在任何位置点击表格行都能够选中改行。

<el-table
  :data="tableData"
  :row-key="row => row.id"
  @current-change="handleRowClick">
  <el-table-column
    type="selection"
    width="55">
    <template slot-scope="{row}">
      <span 
        style="position:absolute;top:0;left:0;width:100%;height:100%;cursor:pointer"
        @click.native.stop.prevent="handleRowClick(row)"
        />
    </template>
  </el-table-column>
  <el-table-column
    prop="name"
    label="姓名">
  </el-table-column>
  <el-table-column
    prop="age"
    label="年龄">
  </el-table-column>
</el-table>

以上代码中,我们在单选框内添加了一个跨度位置的绝对定位的span元素,并监听其click事件,这样用户在点击表格行时,实质上是在点击单选框的可点击区域,从而达到了增加选中体验选项的目的。

二、设置默认选中第一行

在一般情况下,用户进入页面时比较希望看到一些默认数据。通过设置默认选中第一行,可以快速启动一个需要用户操作的功能。

实现方法相对来说很简单,只需要在mounted钩子函数中执行表格的setCurrentRow方法,将第一行设置为默认选项即可。

mounted() {
  this.$nextTick(() => {
    if (this.$refs.table && this.tableData.length) {
      this.$refs.table.setCurrentRow(this.tableData[0]);
    }
  });
}

以上代码中,我们监听了mounted钩子函数,通过$refs获取表格实例,在设置表格默认选中行时需要保证表格的数据this.tableData已经加载完毕。

三、在表格外添加全选功能

单选模式下,我们可能也会需要选择多个元素进行操作。添加全选功能可以满足这个需求。

该功能的具体实现方式是,在表格外添加一个全选框,并绑定一个事件,对选中的行进行记录和操作。

<template>
  <div>
    <el-checkbox v-model="allChecked" @change="handleAllCheckChange">全选</el-checkbox>
    <el-table
      :data="tableData"
      :row-key="row => row.id">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="age"
        label="年龄">
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      allChecked: false,
      tableData: [
        {
          id: 1,
          name: '小明',
          age: 18
        },
        {
          id: 2,
          name: '小红',
          age: 20
        },
        {
          id: 3,
          name: '小张',
          age: 22
        }
      ],
      checkedData: []  //选中的数据
    };
  },

  methods: {
    handleAllCheckChange(val) {
      this.allChecked = val;
      if (this.tableData.length) {
        this.checkedData = val ? this.tableData : [];  //将所有数据加入或清空选中列表
        this.$refs.table.toggleAllSelection();  //改变表格的全选状态
      }
    }
  }
};
</script>

以上代码中,我们在表格外添加了一个全选框,并在handleChange事件中记录选中的行。为了加强全选功能,在表格头中增加一个全选框,通过toggleAllSelection方法来控制表格中的行的选中状态。

四、通过拖拽选择实现单选

通过鼠标拖拽实现单选是常见的UI常见功能。在el-table中也可以通过增加一个隐藏的单选框来实现该功能。

<template>
  <el-table
    ref="table"
    :data="tableData"
    :row-key="row => row.id">
    <el-table-column
      type="selection"
      width="55">
      <template slot-scope="{row}">
        <span 
          style="position:absolute;top:0;left:0;width:100%;height:100%;cursor:pointer;z-index:-1"
          :class="{'el-checkbox': true, 'is-checked': row === checkedRow}"
          :style="{ 'pointer-events': 'none' }"
          />
      </template>
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名">
    </el-table-column>
    <el-table-column
      prop="age"
      label="年龄">
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        {
          id: 1,
          name: '小明',
          age: 18
        },
        {
          id: 2,
          name: '小红',
          age: 20
        },
        {
          id: 3,
          name: '小张',
          age: 22
        }
      ],
      checkedRow: null,  //选中的数据
      startRow: null,  //拖拽开始的行数据
      isMouseDown: false  //鼠标是否按下
    };
  },
  mounted() {
    const thiz = this;
    document.body.addEventListener('mousedown', function() {
      thiz.isMouseDown = true;
    });
    document.body.addEventListener('mouseup', function() {
      thiz.isMouseDown = false;
      thiz.startRow = null;
    });
    this.$nextTick(function() {
      const rows = this.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
      for (let i = 0; i < rows.length; i++) {
        rows[i].addEventListener('mousedown', function() {
          thiz.startRow = thiz.tableData[i];
        });
        rows[i].addEventListener('mouseover', function() {
          if (thiz.isMouseDown && thiz.startRow) {
            thiz.checkedRow = thiz.tableData[i];
          }
        });
      }
    });
  }
};
</script>

以上代码中,我们在mounted中监听mouse事件,增加了拖拽选择实现单选的效果。在初次点击表格时,记录起始选择位置的数据,并通过监听mouseover事件实时更新选择范围。

五、增加单元格可点击区域

除了表格行外,有时也需要单元格可以被点击来实现更细节的操作。通过为单元格内容增加点击事件,我们可以进行一些更为灵活和定制化的操作。

<el-table
  :data="tableData"
  :row-key="row => row.id">
  <el-table-column
    prop="name"
    label="姓名">
    <template slot-scope="{row}">
      <span 
        :style="{cursor: 'pointer'}"
        @click="handleCellClick(row)">
        {{ row.name }}
      </span>
    </template>
  </el-table-column>
  <el-table-column
    prop="age"
    label="年龄">
    <template slot-scope="{row}">
      <span 
        :style="{cursor: 'pointer'}"
        @click="handleCellClick(row)">
        {{ row.age }}
      </span>
    </template>
  </el-table-column>
</el-table>

以上代码中,我们对需要点击的单元格中的内容增加了click事件,这样就能够实现对单元格的简单操作了。