Xin's blog Xin's blog
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

Xin

英雄可不能临阵脱逃啊~
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • HTML

  • CSS

  • JavaScript

  • Vue

  • 组件与插件

    • ui组件

      • 自定义饿了么分页器样式
      • el-table实现跨页选中
        • el-table配置
        • 主要方法
          • 单选或者单击table某一行时选中
          • 多选
      • 使用el-table实现前端分页
      • 覆盖ele的样式
      • 自定义ele树形控件样式
      • 清除el-form表单内容
      • 因el-select的远程搜索导致的问题
    • 插件

  • css扩展语言

  • 学习笔记

  • 前端
  • 组件与插件
  • ui组件
ctrlwin
2022-02-23

el-table实现跨页选中

# el-table实现跨页选中

# el-table配置

el-table的column有这么一个属性:

  • reserve-selection
    • 仅对 type=selection 的列有效, 类型为 Boolean,为 true 则会在 数据更新之后保留之前选中的数据(需指定 row-key)

添加这个属性后就可以让el-table记住选中的数据了,然后我们配置一下:

    <el-table
      ref="skuTable"
      :data="codeList"
      border
      row-key="code"
      @row-click="handleSelectionChange"
      @selection-change="multiSelectionChange"
    >
      <!--多选-->
      <el-table-column
        v-if="isSelection"
        :selectable="disabledCheckbox"
        type="selection"
        reserve-selection
        min-width="3%"
      />
      <!--单选-->
      <el-table-column
        v-else
        min-width="3%"
      >
        <template slot-scope="scope">
          <span
            :class="[
              'el-radio__input',
              scope.row.checked ? 'is-checked' : '',
              scope.row.disabled ? 'is-disabled' : '',
            ]"
            @click.native="handleSelectionChange(scope.row)"
          >
            <span
              class="el-radio__inner"
            ><i
              v-if="scope.row.checked"
              class="el-radio__original"
            /></span>
          </span>
        </template>
      </el-table-column>
    </el-table>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

# 主要方法

data中定义的属性:

codeList: [], /** table列表 */,
multiSelectListAll: [], // 保存所有选中的数据,用于跨页选择
isSelection: true, // 选择table是单选还是多选
1
2
3

# 单选或者单击table某一行时选中

    /** 单选 */
    handleSelectionChange(val) {
      if (this.isSelection) { // 判断是多选还是单选
        let repeatCode = this.multiSelectListAll.find((item) => {
          return item.code === val.code;
        });
        this.$nextTick(() => {
          // 判断当前元素是否已选择,是则移除选中,否则添加选中
          if (!repeatCode) {
            this.multiSelectListAll.push(val);
            this.$refs.skuTable.toggleRowSelection(val, true);
          } else {
            let index = this.multiSelectListAll.findIndex((item) => {
              return item.code === val.code;
            });
            this.multiSelectListAll.splice(index, 1);
            this.$refs.skuTable.toggleRowSelection(val, false);
          }
        });
      } else {
        // 单选,通过给table数据添加 checked 属性,判断是否选中
        this.codeList.map((item) => {
          if (item.code !== val.code) item.checked = false;
          else {
            item.checked = true;
          }
        });
      }
    },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 多选

    /** 多选 **/
    multiSelectionChange(val) {
       // val.length为0时说明已选数据被全部删除
      if (val.length > 0) {
         // 判断table中的已选择数据与本地已选择数据是否不同来确定是删除或添加
        let newArr = this.getArrDifSameValue(val, this.multiSelectListAll);
        // newArr.length 大于0说明是删除数据
        if (newArr.length > 0) {
          let index = this.multiSelectListAll.findIndex((item) => {
            return newArr[0].code === item.code;
          });
          if (index !== -1) this.multiSelectListAll.splice(index, 1);
        } else {
          this.multiSelectListAll.push(...val);
          // 对保存的数据去重
          this.multiSelectListAll = this.arrayUnique(
            this.multiSelectListAll,
            "code"
          );
        }
      } else {
        // 清空本地数据
        this.multiSelectListAll.splice(0, this.multiSelectListAll.length);
      }
    },
    /** 获取被删除的元素 **/
    getArrDifSameValue(arr1, arr2) {
      let result = [];
      arr2.forEach((item) => {
        let isRepeat = arr1.find((ite) => item.code === ite.code);
        if (!isRepeat) {
          result.push(item);
        }
      });
      return result;
    },
     /**对象数组去重**/
    arrayUnique(arr, code) {
      let map = new Map();
      for (let item of arr) {
        if (!map.has(item[code])) {
          map.set(item[code], item);
        }
      }
      return [...map.values()];
    },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

参考链接:el-table多选框,分页保留上页选中目标 (opens new window)

在GitHub上编辑 (opens new window)
#ele
上次更新: 2/24/2022, 2:46:31 PM

← 自定义饿了么分页器样式 使用el-table实现前端分页→

最近更新
01
createElement函数创建虚拟DOM
05-26
02
clipboard 剪切板属性
05-26
03
vue的权限管理
05-16
更多文章>
Theme by Vdoing | Copyright © 2021-2022 Xin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×