需求:最近碰见一个需求,有三万多条数据,用户点击全选按钮,要将三万条数据全部选中。
template

<el-checkbox
        v-model="datCheckAll"
        style="float: right"
        label="全选"
        v-show="activeName == 'dat'"
        :indeterminate="isIndeterminate"
        @change="handleCheckAllDatChange"
        border
      ></el-checkbox>
      <el-row style="height: calc(100% - 40px)" v-show="activeName == 'dat'">
      <el-table
        style="width: 100%; margin: auto"
        height="94.3%"
        border
        ref="table1"
        :row-key="bid"
        :data="DatTableData"
        @selection-change="selectChange"
        @select="selectSingleDat"
        @select-all="selectAllDat"
      >
        <el-table-column
          type="selection"
          :reserve-selection="true"
        ></el-table-column>
        <el-table-column
          type="index"
          align="center"
          width="80px"
        ></el-table-column>
        <el-table-column
          prop="amodeldata"
          sortable
          label="基准"
        ></el-table-column>
        <el-table-column
          prop="bmodeldata"
          sortable
          label="待同步"
        ></el-table-column>
      </el-table>
      <!-- 分页区域 -->
      <el-pagination
        @size-change="handleSizeChange"
        style="
          background-color: #cccbcb;
          width: 99.4%;
          position: absolute;
          bottom: 0px;
        "
        @current-change="handleCurrentChange"
        :current-page="queryInfo.num"
        :page-sizes="[100, 200, 500, 1000]"
        :page-size="queryInfo.pagesize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total"
      ></el-pagination>
    </el-row>

watch:监听

// 监听相同dat全选方法
    datCheckAll(val) {
      if (val) {
        this.DatTableData.forEach((row, i) => {
          this.$refs.table1.toggleRowSelection(row, true)
        })
      } else {
        // 当点击全选按钮变为非选中状态,将当前所有的已经被
        // 勾选中的数据改变状态
        // this.datCheck.forEach((row) => {
        //   this.$refs.table1.toggleRowSelection(row, false)
        // })
        this.$refs.table1.clearSelection()
      }
    },

methods:

//获取第一页的一百条数据
    async getDat() {
      let { data: res } = await this.$axios.post(
        '/datasync/datcontentquery',
        JSON.stringify(this.map),
        {
          headers: {
            'Content-Type': 'application/json;charset=UTF-8',
          },
        }
      )
      //将数据赋值给表格绑定数据,仅用来进行数据展示,该数据会被覆盖,不会在此数据只是进行操作。
      this.DatTableData = res.datsame.content 
      this.total = res.datsame.totalElements
    },
     //获取所有数据
    async getAllDat() {
      let map = JSON.parse(JSON.stringify(this.map))
      // 将total的真实值赋予datpagesize,调用一次函数将所有的dat数据获取到
      map.datpagesize = this.total 
      let { data: res } = await this.$axios.post(
        '/datasync/datcontentquery',
        JSON.stringify(map),
        {
          headers: {
            'Content-Type': 'application/json;charset=UTF-8',
          },
        }
      )
      this.allDatData = res.datsame.content //相同dat数据的全部数据
      //将获取的所有数据的前100条数据重新赋值给表格,保持整个表格的数据来源一致。
      this.DatTableData = this.allDatData.slice(0, 100) 
    },
    //监听dat左侧表格选中数据
    selectChange(val) {
      //将当前选中的数据赋值给datCheck,在所有数据的全选按钮没有选中的情况下,最后计算时
      // 的数据就是datCheck里面的数据
      this.datCheck = val 
    },
     // 对于当前页单选和全选按钮,在所有数据全选按钮没有选中的情况下,点击选中的数据会
    // 经过‘selectChange’方法赋值给datCheck,当所有数据全选按钮选中的情况下,点击某条数据或
    // 某几十条数据后,则将被选中的数据与datClick里面的数据进行对比,如果没有相同的数据,则将选
    // 中的数据放进datClick数据里面,如果有形同的数据,则将被选中的数据从datClick里面取出来。
    // 单击选择某一页dat表格数据的select方法
    selectAllDat(selection) {
      let DatTableDataId = this.DatTableData.map((ele) => {
        return ele._id
      })
      let datClickId = this.datClick.map((ele) => {
        return ele._id
      })
      if (this.isDatAllChecked) {
        
        if (_.intersection(DatTableDataId, datClickId).length == 0) {
          this.datClick = _.concat(this.datClick, this.DatTableData)
        } else {
          
          _.intersection(DatTableDataId, datClickId).forEach((element) => {
            this.datClick.forEach((ele, i) => {
              if (ele._id == element) {
                if (this.datClick.indexOf(ele) !== -1) {
                  this.datClick.splice(this.datClick.indexOf(ele), 1)
                }
              }
            })
          })
        }
      }
    },
    // 单击选择一条dat表格数据的select方法
    selectSingleDat(selection, row) {
      // 只有当全选按钮被选中才执行下面代码,
      // 没有选中时执行selectChange函数
      // 判断当前行数据是否已经选中,若已经选中,再次点击时,从数组
      // 中取出,若没有选中,再次点击,放进数组之中。
      if (this.isDatAllChecked) {
        let arr = this.datClick.map((ele) => {
          return ele._id
        })
        if (!arr.includes(row._id)) {
          this.datClick.push(row)
        } else {
          this.datClick.forEach((ele, i) => {
            if (ele._id == row._id) {
              if (this.datClick.indexOf(ele) !== -1) {
                this.datClick.splice(this.datClick.indexOf(ele), 1)
              }
            }
          })
        }
      }
    },
        // 监听dat同步按钮
    async synchronization() {
      // dat
      let allDatDataCopy = JSON.parse(JSON.stringify(this.allDatData))
      if (this.isDatAllChecked && this.datClick.length == 0) {
        this.datCheck = allDatDataCopy
      } else if (this.isDatAllChecked && this.datClick.length !== 0) {
        this.datClick.forEach((element) => {
          allDatDataCopy.splice(allDatDataCopy.indexOf(element), 1)
        })
        this.datCheck = allDatDataCopy
      }
      // 不同dat
      let allDatDiffDataCopy = JSON.parse(JSON.stringify(this.allDatDiffData))
      if (this.isDatDiffAllChecked && this.datDiffClick.length == 0) {
        this.datDiffCheck = allDatDiffDataCopy
      } else if (this.isDatDiffAllChecked && this.datDiffClick.length !== 0) {
        this.datDiffClick.forEach((element) => {
          allDatDiffDataCopy.splice(allDatDiffDataCopy.indexOf(element), 1)
        })
        this.datDiffCheck = allDatDiffDataCopy
      }
      // swi
      let allSwiDataCopy = JSON.parse(JSON.stringify(this.allSwiData))
      if (this.isSwiAllChecked && this.swiClick.length == 0) {
        this.swiCheck = allSwiDataCopy
      } else if (this.isSwiAllChecked && this.swiClick.length !== 0) {
        this.swiClick.forEach((element) => {
          allSwiDataCopy.splice(allSwiDataCopy.indexOf(element), 1)
        })
        this.swiCheck = allSwiDataCopy
      }
      // 不同dat
      let allSwiDiffDataCopy = JSON.parse(JSON.stringify(this.allSwiDiffData))
      if (this.isSwiDiffAllChecked && this.swiDiffClick.length == 0) {
        this.swiDiffCheck = allSwiDiffDataCopy
      } else if (this.isSwiDiffAllChecked && this.swiDiffClick.length !== 0) {
        this.swiDiffClick.forEach((element) => {
          allSwiDiffDataCopy.splice(allSwiDiffDataCopy.indexOf(element), 1)
        })
        this.swiDiffCheck = allSwiDiffDataCopy
      }
      // 更改数据格式
      let arr = this.datCheck.map((ele) => {
        let aid = ele.aid
        let bid = ele.bid
        let array = { aid: bid }
        for (var key in array) {
          var newKey = aid
          array[newKey] = array[key]
          delete array[key]
        }
        return array
      })
      this.$confirm(
        '您要同步的数据为' +
          this.datCheck.length +
          '条数据',
        '提示',
        {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning',
        }
      )
        .then(async () => {
          if (arr.length > 10000) {
            // 当arr长度超过1万,将其拆分一个每个元素包含一万个数据的数组
            let num = arr.length / 10000
            for (let i = 0; i < num; i++) {
              this.dattb(
                this.arraydat,
                arr.slice(i * 10000, (i + 1) * 10000),
                i
              )
            }
          } else if (arr.length > 0 && arr.length <= 10000) {
            this.arraydat.datlist = arr
            await this.dattb(this.arraydat)
          }
        })
        .catch((err) => {
          // console.log(err)
          this.$message({
            type: 'info',
            message: '已取消',
          })
        })
    },
     // dat全选按钮触发时调用
    handleCheckAllDatChange(val) {
      // 全选按钮选中时val为true,取消选中时val为false
      this.isDatAllChecked = val
      if (!val) {
        // 当全选按钮变为非选中状态,datClick中的数据将失去作用,
        // 当再次点击全选按钮变为全选状态时,datClick应该为空数组
        this.datClick = []
      }
    },
    // 监听分页方法
    handleCurrentChange(newnum) {
      this.queryInfo.num = newnum
      this.DatTableData = this.allDatData.slice(
        (newnum - 1) * this.queryInfo.pagesize,
        newnum * this.queryInfo.pagesize
      )
      let datClickId = this.datClick.map((ele) => {
        return ele._id
      })
      if (this.isDatAllChecked) {
        this.DatTableData.forEach((row) => {
          if (!datClickId.includes(row._id)) {
            this.$refs.table1.toggleRowSelection(row, true)
          }
        })
      }
    },
    // 监听pagesizel
    handleSizeChange(newSize) {
      this.queryInfo.num = 1
      this.queryInfo.pagesize = newSize
      this.DatTableData = this.allDatData.slice(0, newSize)
      let datClickId = this.datClick.map((ele) => {
        return ele._id
      })
      if (this.isDatAllChecked) {
        this.DatTableData.forEach((row) => {
          if (!datClickId.includes(row._id)) {
            this.$refs.table1.toggleRowSelection(row, true)
          }
        })
      }
    },