vue2版本elementUI的table分页实现多选逻辑

news/2025/2/25 7:02:17

1. 需求

我们需要在表格页上实现多选要求,该表格支持分页逻辑。

2. 认识属性

表格属性

参数说明类型可选值默认值
data显示的数据array
row-key行数据的 Key,用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时,该属性是必填的。类型为 String 时,支持多层访问:user.info.id,但不支持 user.info[0].id,此种情况请使用 Function。Function(row)/String

表格事件

事件名说明参数
selection-change当选择项发生变化时会触发该事件selection

表格方法

方法名说明参数
clearSelection用于多选表格,清空用户的选择
toggleRowSelection用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)row, selected
toggleAllSelection用于多选表格,切换所有行的选中状态-

表格列属性

参数说明类型可选值默认值
type对应列的类型。如果设置了 selection 则显示多选框;如果设置了 index 则显示该行的索引(从 1 开始计算);如果设置了 expand 则显示为一个可展开的按钮stringselection/index/expand
selectable仅对 type=selection 的列有效,类型为 Function,Function 的返回值用来决定这一行的 CheckBox 是否可以勾选Function(row, index)
reserve-selection仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key)Booleanfalse

3. 具体代码

<template>
<div>
	<el-table
		v-if="tableVisible"
	    ref="multipleTable"
	    :data="tableData"
	    tooltip-effect="dark"
	    style="width: 100%"
	    row-key="id"
	    @selection-change="handleSelectionChange">
	    <el-table-column
	      :reserve-selection="true"
          :selectable="judgeSelectable"
	      type="selection"
	      width="55">
	    </el-table-column>
	    <el-table-column
	      label="id"
	      width="120">
	      <template slot-scope="scope">{{ scope.row.date }}</template>
	    </el-table-column>
	    <el-table-column
	      prop="name"
	      label="姓名"
	      width="120">
	    </el-table-column>
	  </el-table>
	  <el-pagination
          :current-page="pageNum"
          :page-sizes="[10, 20, 50, 100]"
          :page-size="pageSize"
          layout="total,  prev, pager, next, sizes, jumper"
          :total="total"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
        />
</div>
</template>
  export default {
    data() {
      return {
        tableData: [{
          id: 1,
          name: '王小虎1'
        }, {
          id: 2,
          name: '王小虎2'
        }, {
          id: 3,
          name: '王小虎3'
        }, {
          id: 4,
          name: '王小虎4'
        }, {
          id: 5,
          name: '王小虎5'
        }, {
          id: 6,
          name: '王小虎6'
        }, {
          id: 7,
          name: '王小虎7'
        }],
        multipleSelection: [],
        total: 0,
	    pageSize: 10,
	    pageNum: 1,
		tableVisible: true
      }
    },
	created() {
		this.initData();
	},
    methods: {
		initData() {
			this.getList();
			this.getSelectedList();
		},
		getSelectedList() {
			//	当拿到已选列表时,调用toggleSelection传入已选列表
		},
	    judgeSelectable(row, index) {
	      // 用来区分是否可选
	      return Math.random() > 0.5;
	    },
      toggleSelection(rows) {
        if (rows) {
          rows.forEach(row => {
            this.$refs.multipleTable.toggleRowSelection(row);
          });
        } else {
          this.$refs.multipleTable.clearSelection();
        }
      },
      handleSelectionChange(val) {
        this.multipleSelection = val;
      },
      getList() {
		//	获取数据,更新tableData和total
	  },
	  //  分页size变化
	    handleSizeChange(val) {
	      this.pageSize = val;
	      this.getList();
	    },
	    //  当前页面变化
	    handleCurrentChange(val) {
	      this.pageNum = val;
	      this.getList();
	    },
	    //	必须这么处理
	    toggleSelection(rows) {
	      if (rows) {
	        rows.forEach(row => {
	          this.$refs.multipleTable.toggleRowSelection(row);
	        });
	      } else {
	        this.$refs.multipleTable.clearSelection();
	      }
    	},
		
		//	批量导入或者其他场景下已选数据已更新,就重新处理下页面内容
		regetData() {
			 this.total = 0;
     		 this.pageNum = 1;
     		 this.tableData = [];
     		 this.multipleSelection = [];
			
			this.tableVisible = false;
			
			this.$nextTick(() => {
				this.tableVisible = true;
				this.initData();
			})
		}
    }
  }

4. 解读

分页不需要介绍,主要还是多选说一点。

  1. 表格上必须设置row-key,该字段的值不可重复,这样让表格记住每个数据。
  2. selection-change字段用来监听选择变化,因el-table未提供批量选中方法,故只能调组件上的toggleRowSelection方法一个一个选中。如果需要监听selection-change方法变更记录,最好还是防抖处理,避免初始化一个一个选中导致的数据异常。
  3. el-table-column 使用 type 值为 selection, 该组件上需要设置 reserve-selectiontrue,相关属性解说请看2中解释。属性selectable 则是用来控制是否可选,这个业务功能也要了解下。
  4. 至于具体逻辑可以参考上面代码,有问题来找我。
求关注
在这里插入图片描述

http://www.niftyadmin.cn/n/5865130.html

相关文章

UE5 Gameplay框架及继承关系详解

文章目录 前言一、核心类及其继承关系二、核心类的职责与协作2.1 Actor & Pawn2.2 Controller2.3 GameMode & GameState2.4 PlayerState2.5 HUD & UI 三、协作流程示例总结 前言 Unreal Engine 5&#xff08;UE5&#xff09;的 Gameplay 框架 是一个高度模块化的系…

OpenCV计算摄影学(1)图像修复(Inpainting)的函数inpaint()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用图像中选定区域的邻域来恢复该选定区域。 cv::inpaint 函数是 OpenCV 中用于图像修复&#xff08;Inpainting&#xff09;的一个重要函数。它…

Kafka面试题----Kafka是如何保证顺序消费的

在 Kafka 中&#xff0c;默认情况下消息是按分区进行顺序存储和读取的&#xff0c;但全局顺序消费&#xff08;即所有分区的消息按顺序消费&#xff09;较难实现。下面分别介绍 Kafka 按分区顺序消费以及实现全局顺序消费的相关内容。 按分区顺序消费 Kafka 本身可以保证单个…

机器人“战场”:创新、落地与未来

从1999年的机器管家&#xff0c;2001年的机器人小孩大卫&#xff0c;到2015年拥有自我意识的“查派”&#xff0c;在科幻电影里&#xff0c;人们赋予了对机器人的各种形象和想象。2018年&#xff0c;尽管只是实验室的试验品&#xff0c;但波士顿动力机器狗Spot的视频还是在国内…

python 判断 字符串在字典列表中

在Python中&#xff0c;如果你想判断一个字符串是否存在于一个字典列表中&#xff0c;你可以通过遍历这个列表并检查每个字典是否包含你想要找的字符串键来实现。这里有几种方法可以做到这一点&#xff1a; 方法1&#xff1a;使用any()函数 你可以使用any()函数和字典的get方法…

【MySQL】第九弹---掌握SQL关键操作:更新、删除、插入与聚合分析的秘诀

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1 Update 2 Delete 2.1 删除数据 2.2 截断表 3 插入查询结果 4 聚合函数 5 group by子句的使用 1 Update 语法…

【AI+智造】DeepSeek价值重构:当采购与物控遇上数字化转型的化学反应

作者&#xff1a;Odoo技术开发/资深信息化负责人 日期&#xff1a;2025年2月24日 引言&#xff1a;从事企业信息化工作16年&#xff0c;我见证过无数企业从手工台账到ERP系统的跨越。但真正让采购和物控部门脱胎换骨的&#xff0c;是融合了Deepseek AI的Odoo数字化解决方案——…

如何在 CMake 上设置新项目以获得成功

选择正确的构建系统可以决定项目的成功与否。从处理依赖项到确保正确编译和链接代码&#xff0c;正确的构建系统可以节省 你时间并避免潜在的麻烦。 在众多可用选项中&#xff0c;CMake 构建系统脱颖而出&#xff0c;可以处理复杂的跨平台项目。 本教程介绍了 CMake 的受欢迎…