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

vxe-table v4实现按住shift实现连续勾选多选

之前介绍过element-plus el-table 按住shift实现连续勾选多选,这里把vxe-table的实现方式也顺便写下,基本上差不多:

vxe-table v4实现按住shift实现连续勾选多选


实现方法:

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

<vxe-table
  size="small"
  ref="vTable"
  :data="tableData"
  @checkbox-all="handleSelectionChange"
  @checkbox-change="shiftSelect"
>
</vxe-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.startPoint = undefined // 清空多选起点
      this.endPoint = undefined // 清空多选终点
    }
  })
},


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

methods: {
  // 多选
  handleSelectionChange(e) {
    const rows = [...e.records]
    this.selectDatas = JSON.parse(JSON.stringify(rows))
    this.handlerSelectRow(rows)
  },
  shiftSelect(e) {
    let rows = [...e.records]
    const row = e.row
    // 判断是勾选的时候才会多选
    if (rows.length < this.selectDatas.length) {
      this.startPoint = undefined// 清空多选起点
      this.endPoint = undefined// 清空多选终点
    }
    // 判断此时有没有按住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.vTable.toggleCheckboxRow(this.tableData[i], true)
        }
        this.startPoint = undefined // 清空多选起点
        this.endPoint = undefined // 清空多选终点
      }else{ // 之前没有多选起点
        this.startPoint = row.index // 把当前项的index标记为多选起点
      }
    }else{ // 没按住shift键
      this.startPoint = undefined // 清空多选起点
      this.endPoint = undefined // 清空多选终点
    }
    setTimeout(() => {
      const $table = this.$refs.vTable
      if ($table) {
        const selectRecords = $table.getCheckboxRecords()
        this.selectDatas = JSON.parse(JSON.stringify(selectRecords))
      }
    }, 30)
  },
}