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

问题描述:

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

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

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

解决方法:

javascript 复制代码
<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和人员姓名:

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

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

javascript 复制代码
// 获取参会人员列表  获取全部人员名单
    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表单、重置分页信息

bash 复制代码
    // 关闭人员列表弹框
 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 "官网解释如下:

具体实现代码及解释如下:

javascript 复制代码
   // 选择参会人员(已经存在的数据就取消勾选、未存在过的数据就加入勾选)
    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);  //删除暂存的需要取消勾选的人员姓名
            }
          });
        });
      }
    }

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

javascript 复制代码
   this.echoList = []
      this.echoListName = []
      this.$refs.personsTable.clearSelection();
      this.personsForm.userName = null;
相关推荐
JIngJaneIL2 小时前
就业|高校就业|基于ssm+vue的高校就业信息系统的设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·高校就业
一 乐2 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·小区互助系统
shmily麻瓜小菜鸡3 小时前
Element Plus 的 <el-table> 怎么点击请求后端接口 tableData 进行排序而不是网络断开之后还可以自己排序
前端·javascript·vue.js
一 乐4 小时前
游戏助手|游戏攻略|基于SprinBoot+vue的游戏攻略系统小程序(源码+数据库+文档)
数据库·vue.js·spring boot·后端·游戏·小程序
毕设十刻5 小时前
基于Vue的鲜花销售系统33n62(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
533_14 小时前
[element-plus] el-tree 动态增加节点,删除节点
前端·javascript·vue.js
程序猿_极客14 小时前
Vue 2脚手架从入门到实战核心知识点全解析(day6):从工程结构到高级通信(附代码讲解)
前端·javascript·vue.js·vue2学习笔记
一只小阿乐14 小时前
vue3 使用v-model开发弹窗组件
javascript·vue.js·elementui
web加加14 小时前
vue3 +vite项目页面防f12,防打开控制台
前端·javascript·vue.js
KYumii16 小时前
智慧判官-分布式编程评测平台
vue.js·spring boot·分布式·spring cloud·java-rabbitmq