解决el-table组件中,分页后数据的勾选、回显问题?

问题描述:

    1、记录一个弹窗点击确定按钮后,table列表所有勾选的数据信息

    2、再次打开弹窗,回显勾选所有保存的数据信息

    3、遇到的bug:切换分页,其他页面勾选的数据丢失;点击确认只保存当前页的数据;勾选数据保存后但并未回显......

解决方法:

<Modal
  v-model="showPersons"       
  title="人员列表"             <!-- 模态框的标题 -->
  @on-cancel="onClose3"       <!-- 取消按钮的点击事件处理函数 -->
  width="40%"                 <!-- 模态框的宽度 -->
  :mask-closable="false"      <!-- 是否可以通过点击遮罩层关闭模态框 -->
>
  <Form :model="personsForm" :label-width="60" inline>     <!-- 表单组件,绑定数据模型personsForm -->
    <FormItem label="姓名:">        <!-- 表单项的标签 -->
      <Input v-model.trim="personsForm.userName" clearable></Input>   <!-- 输入框组件,绑定数据模型personsForm.userName,可清空输入内容 -->
    </FormItem>
    <div class="btns">             <!-- 按钮容器 -->
      <Button @click="onReset1" style="margin-right: 8px">重 置</Button>     <!-- 重置按钮,点击事件处理函数onReset1 -->
      <Button type="primary" @click="userNameSearch">查 询</Button>        <!-- 查询按钮,点击事件处理函数userNameSearch -->
    </div>
  </Form>
  <el-table
    v-if="showPersons"           <!-- 控制表格的显示与隐藏 -->
    ref="personsTable"           <!-- 表格的引用名 -->
    :data="personsList"          <!-- 表格的数据源 -->
    style="margin-top: 16px"     <!-- 表格的样式 -->
    row-key="user_id"            <!-- 表格行的唯一标识符 -->
    @select="handleSelectionChange"   <!-- 选择某一行时的事件处理函数handleSelectionChange -->
    @select-all="handleAllChange"      <!-- 全选/取消全选时的事件处理函数handleAllChange -->
  >
    <el-table-column
      type="selection"           <!-- 表格列的类型为选择列 -->
      width="45"                 <!-- 表格列的宽度 -->
      :reserve-selection="true"  <!-- 保留之前的选择状态 -->
      align="center"             <!-- 表格列的对齐方式为居中 -->
      fixed                      <!-- 表格列固定在左侧 -->
    />
    <el-table-column label="序号" width="55" fixed align="center">   <!-- 表格列的标签、宽度、对齐方式 -->
      <template slot-scope="scope">        <!-- 自定义列模板 -->
        {{ scope.$index + 1 }}             <!-- 显示行号 -->
      </template>
    </el-table-column>
    <el-table-column
      label="姓名"                         <!-- 表格列的标签 -->
      prop="user_name"                    <!-- 表格列绑定的数据字段 -->
      :show-overflow-tooltip="true"       <!-- 当内容溢出时显示tooltip -->
    />
  </el-table>
  <Page
    v-show="personTotal > 0"              <!-- 控制分页组件的显示与隐藏 -->
    :total="personTotal"                  <!-- 总条目数 -->
    size="small"                          <!-- 分页组件的尺寸 -->
    show-elevator                         <!-- 显示跳转输入框 -->
    show-sizer                            <!-- 显示每页条数选择框 -->
    show-total                            <!-- 显示总条目数 -->
    class="page"                          <!-- 分页组件的样式类名 -->
    :page-size-opts="[10, 20, 30, 40]"     <!-- 每页条数的选项 -->
    :page-size="personsForm.pageSize"     <!-- 每页条数的绑定值 -->
    :current="personsForm.pageNo"         <!-- 当前页码的绑定值 -->
    @on-change="changePersonsPage"        <!-- 页码变化时的事件处理函数changePersonsPage -->
    @on-page-size-change="personsPageSizeChange"   <!-- 每页条数变化时的事件处理函数personsPageSizeChange -->
  />
  <div slot="footer" align="center">       <!-- 模态框底部的插槽内容 -->
    <Button type="primary" @click="personsSubmit">确 定</Button>   <!-- 确定按钮,点击事件处理函数personsSubmit -->
  </div>
</Modal>

在data中定义暂存勾选的人员Id和人员姓名:

data () {
    return {
        personsList: [], // 人员列表list
        echoList: [],// 人员选中的所有id
        echoListName: []// 人员选中的所有名字
    }

首先需要通过接口获取所有待勾选的人员信息,回显之前暂存的数据信息:

// 获取参会人员列表  获取全部人员名单
    getpersonsList (pageNo, pageSize) {
      //调用接口
      personsList(this.personsForm).then((response) => {
        this.personTotal = response.page.total
        this.personsList = response.data  //暂存所有的人员信息
        this.$nextTick(() => {
          this.personsList.forEach(item => {
            //查询当前列表并回显
            if (this.echoList.includes(item.user_id)) {
              //设置当前行数据为选中状态
              this.$refs.personsTable.toggleRowSelection(item, true); 
            }
          })
        })
      })
    }

其中“ @on-cancel="onClose3" ”表示关闭modal弹窗后进行的操作:保存勾选数据、清空勾选效果、清空form表单、重置分页信息

    // 关闭人员列表弹框
 onClose3 () {
      this.showPersons = false  //关闭modal弹窗
      this.echoList = []  //置空暂存的勾选人员Id
      this.echoListName = []  //置空暂存的勾选人员姓名
      this.$refs.personsTable.clearSelection();  //清空未保存勾选
      this.personsForm.pageSize = 10
      this.personsForm.pageNo = 1
      this.personsForm.userName = null
    }

" @select ",“ @select-all ”官网解释如下:
在这里插入图片描述
具体实现代码及解释如下:

   // 选择参会人员(已经存在的数据就取消勾选、未存在过的数据就加入勾选)
    handleSelectionChange(selecteds, row) {
      if (!this.echoList.includes(row.user_id)) {
        this.echoList.push(row.user_id);  //暂存新勾选的人员Id
        this.echoListName.push(row.user_name);  //暂存新勾选的人员姓名
      } else {
        this.echoList.forEach((id, index) => {
          if (id == row.user_id) {
            this.echoList.splice(index, 1);  //删除暂存的需要取消勾选的人员Id
            this.echoListName.splice(index, 1);  //删除暂存的需要取消勾选的人员姓名
          }
        });
      }
    },
    // 全选、取消全选
    handleAllChange(selecteds) {
      if (selecteds.length > 0) {
        selecteds.forEach(item => {
          if (!this.echoList.includes(item.user_id)) {
            this.echoList.push(item.user_id);  //暂存新勾选的人员Id
            this.echoListName.push(item.user_name);  //暂存新勾选的人员姓名
          }
        });
      } else {
        this.personsList.forEach(item => {
          this.echoList.forEach((id, index) => {
            if (id === item.user_id) {
              this.echoList.splice(index, 1);  //删除暂存的需要取消勾选的人员Id
              this.echoListName.splice(index, 1);  //删除暂存的需要取消勾选的人员姓名
            }
          });
        });
      }
    }

最后,记得在关闭弹窗时清空勾选及表单:

   this.echoList = []
      this.echoListName = []
      this.$refs.personsTable.clearSelection();
      this.personsForm.userName = null;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/247277.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

迅为RK3588开发板瑞芯微国产化工业ARM核心板AI人工智能

性能强 iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代AloT高端应用芯片&#xff0c;采用8nm LP制程&#xff0c;搭载八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架构&#xff0c;主频高达2.4GHz&#xff0c;8GB内存&#xff0c;32GB EMMC。 四核心…

ACL和NAT

文章目录 ACL和NAT一、ACL概述及产生背景1、ACL访问控制列表2、ACL工作原理3、ACL种类4、ACL命令配置步骤4.1 ACL命令配置4.1 ACL配置步骤 二、NAT&#xff08;网络地址转换&#xff09;1、NAT概述2、NAT类型2.1 静态NAT与动态NAT 3、NATPT&#xff08;端口映射&#xff09;4、…

成都工业学院Web技术基础(WEB)实验二:HTML5表格、表单标签的使用

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

Arduino使用定时器设置周期时间运行程序

1、用Arduino millis() 函数 实现一定程度上的多任务系统&#xff0c;可以设置不同时间的任务周期去执行对应的程序。比如需要10毫秒执行一次的程序、100毫秒执行一次的程序、1秒执行一次的程序。 2、Delay(ms)是延时函数&#xff0c;使用该延时函数&#xff0c;后面的程序将会…

租一台服务器多少钱决定服务器的价格因素有哪些

租一台服务器多少钱决定服务器的价格因素有哪些 大家好我是艾西&#xff0c;服务器这个名词对于不从业网络行业的人们看说肯定还是比较陌生的。在21世纪这个时代发展迅速的年代服务器在现实生活中是不可缺少的一环&#xff0c;平时大家上网浏览自己想要查询的信息等都是需要服…

统信UOS上图形化配置系统和应用代理

原文链接&#xff1a;统信UOS上图形化配置系统和应用代理 hello&#xff0c;大家好啊&#xff0c;今天我要给大家介绍的是在统信UOS操作系统上如何通过图形化界面配置系统代理和应用代理。在许多公司的内网环境中&#xff0c;直接访问互联网可能受到限制&#xff0c;但通常会提…

关于linux 磁盘占用排查问题

1.关于磁盘 查看整体磁盘占用大小 df -h 2. 先排除mysql 数据大小 查询库的大小 SELECT table_schema AS "Database", ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema…

ACL与NAT

目录 一、ACL &#xff08;一&#xff09;ACL基本理论 &#xff08;二&#xff09;ACL的类型 1.基本ACL 2.高级ACL 3.二层ACL &#xff08;三&#xff09;基本原理 &#xff08;四&#xff09;项目实验 通配符掩码 二、NAT &#xff08;一&#xff09;基本理论 &am…

【XR806开发板试用】+Linux小白上手开发笔记(2)——阿里云云方案

##0、前言 在之前文章中提到&#xff0c;在windows中搭建unbuntu对于新手小白来说非常不友好。因此一直在找解决方案&#xff0c;找到一条非常有意思的方案。希望对大家有点帮助。 1、环境搭建 方案核心————阿里云云 具体步骤如下&#xff1a; step1&#xff1a;注册。由…

【Python可视化系列】一文教会你绘制美观的柱状图(理论+源码)

一、前言 前面我详细介绍了如何绘制漂亮的折线图&#xff1a; 【Python可视化系列】一文彻底教会你绘制美观的折线图&#xff08;理论源码&#xff09; 本篇文章将教你绘制美观的柱状图。柱状图&#xff08;Bar Chart&#xff09;是一种常用的统计图表&#xff0c;用于展示不同…

Nginx 代理 MySQL 连接,并限制可访问IP

1.前言 我们的生产环境基本上都部署在云服务器上&#xff0c;例如应用服务器、MySQL服务器等。如果MySQL服务器直接暴露在公网&#xff0c;就会存在很大的风险&#xff0c;为了保证数据安全&#xff0c;MySQL服务器的端口是不对外开放的。 好巧不巧&#xff0c;线上业务遇到b…

自动化测试(一)配置selenium环境(带图文,防止踩坑)

目录 配置selenium环境 1. 安装setuptools 2. 安装selenium 3. 安装驱动 如何查看谷歌浏览器版本 上一章讲述了如何安装python环境&#xff0c;那么&#xff0c;这一章讲述的是&#xff0c;如何配置自动化测试&#xff08;selenium&#xff09;环境~吧&#x1f937;‍♀️…

设计模式详解---抽象工厂模式

继续前言&#xff0c;工厂模式中抽象工厂模式的讲解&#xff1a; 1. 前面的工厂模式有啥问题&#xff1f; 前面的工厂模式有这么个问题&#xff1a;一个产品就给了一个工厂&#xff0c;这样子如果产品变多&#xff0c;系统就会很复杂&#xff1a; 2. 解决方法 我们可以按照手…

前端js实现将异步封装成promise然后用async await转同步

&#xff08;一&#xff09;需求背景&#xff1a; 哈喽 大家好啊&#xff0c;今天遇到一个问题&#xff0c;需要将异步请求转换成同步 &#xff08;二&#xff09;相关代码&#xff1a; function getInfo() {return new Promise((resolve,reject)> {setTimeout(()> {re…

vue_域名部署无法访问后端

前言 目前部署的比较另类&#xff0c;因为服务器为windows&#xff0c;目前还不是很会nginx&#xff0c;所以现在就只能在服务器上安装nodejs&#xff0c;然后直接使用npm run dev命令行的方式运行项目 遇到的坑 使用ip访问前端的时候&#xff0c;就可以访问&#xff0c;但是…

排序之归并排序

归并排序是第一个可以被实际使用的排序算法。归并排序性能不错&#xff0c;其复杂度为O(nlogn)。 归并排序是一种分治算法。其思想是将原始数组切分成较小的数组&#xff0c;直到每个小数组只有一 个位置&#xff0c;接着将小数组归并成较大的数组&#xff0c;直到最后只有一个…

获取Java类路径

利用System.getProperty(“java.class.path”)可以获取Java类路径&#xff08;Java class path&#xff09;。 package com.thb;import java.io.IOException;public class Test5 {public static void main(String[] args) throws IOException {System.out.println(System.getP…

pycharm在终端处删除连接过的服务器

目录 操作 操作 打开设置处的SSH配置进行删除

宝塔面板快速搭建本地网站结合内网穿透实现远程访问【无需公网IP】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…