首页 > 建站教程 > 前端框架 >  element-plus el-table 按住shift实现连续勾选多选正文

element-plus el-table 按住shift实现连续勾选多选

element-plus el-table 按住shift实现连续勾选多选,即选中第一个,按住shift再选中最后一个,会自动将中间的都勾选,效果图如下:

element-plus el-table


实现方法:

1、给el-table加上相关事件:

<el-table
    :data="tableData"
    :row-key="rowKey"
    :key="toggleIndex"
    ref="scTable"
    @selection-change="handleSelectionChange"
    @select="shiftSelect"
>
</el-table>


2、在data中定义相关参数:

data() {
    return {
    selectDatas: [],
    startPoint: 0, // 多选起点
    endPoint: undefined,// 多选终点
    pin: false, // 是否按住,默认不按住
  }
}


3、监听shift按下:

mounted() {
  // 监听keydown:获取键盘按住事件,code返回按住的键信息
  window.addEventListener('keydown', code => {
    // 判断是否按住了shift键(左右都包括)
    if (code.keyCode === 16 && code.shiftKey) {
      this.pin = true // 标记按住了shift键
      this.startPoint = this.selectDatas.length ? this.selectDatas[this.selectDatas.length-1].index : 0
    }
  })
  // 监听keyup:获取键盘松开事件,code返回按住的键信息
  window.addEventListener('keyup', code => {
    // 判断是否松开了shift键(左右都包括),以为之前已经按下了code.shiftKey已经是true
    if (code.keyCode == 16) {
      this.pin = false // 标记松开了shift键
      this.endPoint = undefined // 清空多选终点
    }
  })
},


4、定义handleSelectionChange和shiftSelect,方法其实通俗易懂,这里就不描述了。

methods: {
  // 多选
  handleSelectionChange(rows) {
    this.selectDatas = JSON.parse(JSON.stringify(rows))
  },
  // 按住shift多选
  shiftSelect(rows, row) {
    // 判断是勾选的时候才会多选
    if (rows.length < this.selectDatas.length) {
      this.startPoint = undefined// 清空多选起点
      this.endPoint = undefined// 清空多选终点
      return
    }
    // 判断此时有没有按住shift键
    // 按住了则表示开始多选,没有则停止多选,清空起点终点.
    // 开始多选则判断之前是否有起点
    // 有则当前的index标记为终点且勾选这之间的数据,勾选结束清空起点终点
    // 没有则当前的index标记为起点
    // 记录当前的index为多选起点
    if (this.pin) { // 按住了shift键
      if (this.startPoint || this.startPoint === 0) { // 之前有多选起点(第一条单独)
        this.endPoint = row.index // 把当前项的index标记为多选终点
        if (this.startPoint > this.endPoint) { // 如果起点大于终点,则替换否则保留,确保起点始终小于终点
          let temp = this.startPoint
          this.startPoint = this.endPoint
          this.endPoint = temp
        }
        // 勾选数据
        const startPoint = this.startPoint
        const endPoint = this.endPoint
        for (let i = startPoint + 1; i < endPoint; i++) {
          this.$refs.scTable.toggleRowSelection(this.tableData[i],true)
        }
        this.startPoint = undefined // 清空多选起点
        this.endPoint = undefined // 清空多选终点
      }else{ // 之前没有多选起点
        this.startPoint = row.index // 把当前项的index标记为多选起点
      }
    }else{ // 没按住shift键
      this.startPoint = undefined // 清空多选起点
      this.endPoint = undefined // 清空多选终点
    }
  },
}