解决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;
相关推荐
一只不会编程的猫16 分钟前
高德地图自定义折线矢量图形
前端·vue.js·vue
来吧~27 分钟前
vue3使用video-player实现视频播放(可拖动视频窗口、调整大小)
前端·vue.js·音视频
呆呆小雅1 小时前
二、创建第一个VUE项目
前端·javascript·vue.js
Fighting_p1 小时前
【记录】列表自动滚动轮播功能实现
前端·javascript·vue.js
Domain-zhuo1 小时前
Git和SVN有什么区别?
前端·javascript·vue.js·git·svn·webpack·node.js
平行线也会相交2 小时前
云图库平台(二)前端项目初始化
前端·vue.js·云图库平台
ai产品老杨2 小时前
报警推送消息升级的名厨亮灶开源了。
vue.js·人工智能·安全·开源·音视频
嘤嘤怪呆呆狗2 小时前
【开发问题记录】使用 Docker+Jenkins+Jenkins + gitee 实现自动化部署前端项目 CI/CD(centos7为例)
前端·vue.js·ci/cd·docker·gitee·自动化·jenkins
丁总学Java3 小时前
去除 el-input 输入框的边框(element-ui@2.15.13)
javascript·vue.js·elementui
GISer_Jing3 小时前
Vue3知识弥补漏洞——性能优化篇
javascript·vue.js·性能优化·vue