当前位置: 首页 > news >正文

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

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. 至于具体逻辑可以参考上面代码,有问题来找我。
求关注
在这里插入图片描述

相关文章:

  • 基于SpringBoot + Vue的共享汽车(单车)管理系统设计与实现+毕业论文+开题报告+指导搭建视频
  • Github更新本地仓库到远程总是失败文件过大,如何解决。
  • 设计模式教程:策略模式(Strategy Pattern)
  • C++程序员内功修炼——Linux C/C++编程技术汇总
  • RK3399 Android7 Ethernet Tether功能实现
  • 香港多IP站群服务器
  • 【时时三省】(C语言基础)顺序程序设计举例
  • 【无人集群系列---大疆无人集群技术进展、技术路线与未来发展方向】
  • 汽车零部件工厂如何通过ESD监控系统闸机提升产品质量
  • 如何在 CMake 上设置新项目以获得成功
  • 起猛了,植物大战僵尸出了金铲铲模式?
  • Linux 核心架构与组件(2025更新中)
  • 回溯算法之组合和排列问题
  • B站pwn教程笔记-2
  • 应对LLM应用中的AI幻觉,如何通过Token对数概率预测LLM的可靠性
  • 【新手入门】SQL注入之伪静态注入
  • 英语学习DAY5
  • 2022 年学习 Spring Boot 开发的最佳书籍
  • Mysql 主从集群同步延迟问题怎么解决?
  • Vi 编辑器基本使用指南
  • 一涉嫌开设赌场的网上在逃人员在山东威海落网
  • 秦洪看盘|缩量回踩,积蓄叩关能量
  • 美凯龙:董事兼总经理车建兴被立案调查并留置
  • 从600名外到跻身大满贯,孙发京:走过的路成就了现在的我
  • 80后莆田市文旅局长马骏登台与杨宗纬合唱,“演唱会秒变旅游推介会”
  • 从采购到销售!市场监管总局指导行业协会防控肉品风险