记录一下处理element table表格数据多选翻页回显实现

本文介绍了如何在Vue.js中处理Element UI的表格数据,实现在多选和翻页后仍能回显已选择的表格行。关键点包括设置`row-key`属性,监听`@select`事件以及在接口查询或翻页时处理回显操作。

table表格数据多选回显实现

实现结果

在这里插入图片描述

HTML代码——截取

<div>
      <el-dialog title="新增" :visible.sync="dialogTableForAddProject" row-key="getRowKeys">
        <el-table :data="projectList" ref="projectTableRef" @select="handleSelectionChange">
          <el-table-column
            type="selection"
            width="55">
          </el-table-column>
          <el-table-column label="项目名称/企业名称" align="center" prop="projectName" />
          <el-table-column label="申报年份" align="center" prop="baseYear" />
          <el-table-column label="区域" align="center" prop="belongToArea" />
        </el-table>
        <el-pagination background layout="total,sizes,prev, pager, next,jumper" :current-page="queryProjectParams.current"
        :page-size="queryProjectParams.size" @size-change="sizeChangeOfProject" @current-change="currentChangeOfProject" :page-sizes="projectSize"
        :total="projectTotal">
      </el-pagination>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogTableForAddProject = false">取 消</el-button>
        <el-button type="primary" @click="dialogTableForAddProject = false">确 定</el-button>
      </div>
      </el-dialog>
    </div>

需要注意的几个点
① row-key=“getRowKeys” 必须要有
②@select=“handleSelectionChange” 处理选中数据的
③这里是在接口查询时进行勾选回显的,也可以在翻页时进行回显勾选处理

JS代码——截取

data() {
return {
    groupId:'', //接收路由参数
    
    dialogTableForAddProject:false,
    queryProjectParams:{
        groupId:'',// 项目组ID
        current: 1, // 当前页数
        size: 10 // 每页显示多少条
    },//查询项目列表参数
    projectTotal:0, // 可新增项目数量总数
    projectSize: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
    projectList:[], //项目数据
    allProjectIds:[], // 汇总总选择的项目ID
    pageProjectIds:[]  //当前页选择的项目ID

};
},
methods: {

    // 打开新增项目弹框
    
    openAddProjectDialog(){
      this.queryProjectParams.groupId = this.$route.query.groupId;
      this.getProjectList()
      this.dialogTableForAddProject = true
    },

    // 查询可新增项目列表参数
    getProjectList(){
      projectRelationPageList(this.queryProjectParams).then(response => {
          if(response.data.code=='0'){
            this.projectList = response.data.data.records
            this.projectTotal = response.data.data.total
            this.setCheckBox();
          }
        });
    },

    // 多选框选中数据
    handleSelectionChange(selection,row) {
      let selected = selection.length && selection.indexOf(row) !== -1
      if(!selected){
        // 取消勾选,剔除
        var i = this.allProjectIds.indexOf(row.instId);
        if(i > -1){
          this.allProjectIds.splice(i,1)
        }
        return;
      }
      this.pageProjectIds = selection.map(item => item.instId);
      // 将项目主键放入总数组中
      this.pageProjectIds.map(projectId => {
        if(this.allProjectIds.indexOf(projectId) == -1){
          this.allProjectIds.push(projectId)
        }
      });
      console.log('汇总===')
      console.log(this.allProjectIds)
      console.log('当前===')
      console.log(this.pageProjectIds)
    },


    //下面的方法是进行设置行标识key的方法
    getRowKeys(row) {
        return row.instId
    },
    // 回显选中数据
    setCheckBox(){
      if(this.projectList != null && this.projectList.length > 0 && this.allProjectIds.length > 0){
        this.allProjectIds.forEach((aId) => {
          this.$nextTick(() => {
            this.projectList.forEach((p) => {
            // 这里根据自己的字段进行判断
              if(aId === p.instId){
                this.$refs.projectTableRef.toggleRowSelection(p);
              }
            })
          })
        })
      }
    },

    sizeChangeOfProject(pageSize) {
     this.queryProjectParams.size = pageSize;
     this.getProjectList();
    },
    currentChangeOfProject(current) {
      this.queryProjectParams.current = current;
      this.getProjectList();
    },
}
上面是部分代码,这里是整个页面的代码(根据需要看这里的代码)
<template>
<div class="app-container">
    <div class="search-box">
      <el-form :model="queryParams" ref="queryForm" :inline="true">
        <el-form-item label="项目名称/企业名称" :label-width="formLabelWidth" prop="projectName">
          <el-input v-model="queryParams.projectName" placeholder="请输入项目名称/单位名称" style="width: 200px"
            @keyup.enter.native="handleQuery" />
        </el-form-item>
         <el-form-item>
          <el-button type="primary" icon="el-icon-search" @click="getList">搜索</el-button>
          <el-button icon="el-icon-refresh" @click="restSearch">重置</el-button>
        </el-form-item>
      </el-form>
      <el-button type="primary" icon="el-icon-plus" size="small" plain @click="openAddProjectDialog()">新增</el-button>
    </div>
    <div class="content-box">
      <el-table border v-loading="loading" :data="list">
        <el-table-column label="序号" align="center" width="50">
          <template slot-scope="scope">
            {{ scope.$index + 1 }}
          </template>
        </el-table-column>
        <el-table-column label="项目名称/企业名称" align="center" prop="projectName" />
        <el-table-column label="申报年份" align="center" prop="baseYear" />
        <el-table-column label="区域" align="center" prop="area" />
        <el-table-column label="操作"  align="center">
          <template slot-scope="scope">
             <el-button type="text" icon="el-icon-view" @click="del(scope.row.baseId)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <el-pagination background layout="total,sizes,prev, pager, next,jumper" :current-page="queryParams.current"
        :page-size="queryParams.size" @size-change="sizeChange" @current-change="currentChange" :page-sizes="size"
        :total="total">
      </el-pagination>
    </div>
    <!--右侧滑框 start-->
    <div>
      <el-dialog title="新增" :visible.sync="dialogTableForAddProject" row-key="getRowKeys">
        <el-table :data="projectList" ref="projectTableRef" @select="handleSelectionChange">
          <el-table-column
            type="selection"
            width="55">
          </el-table-column>
          <el-table-column label="项目名称/企业名称" align="center" prop="projectName" />
          <el-table-column label="申报年份" align="center" prop="baseYear" />
          <el-table-column label="区域" align="center" prop="belongToArea" />
        </el-table>
        <el-pagination background layout="total,sizes,prev, pager, next,jumper" :current-page="queryProjectParams.current"
        :page-size="queryProjectParams.size" @size-change="sizeChangeOfProject" @current-change="currentChangeOfProject" :page-sizes="projectSize"
        :total="projectTotal">
      </el-pagination>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogTableForAddProject = false">取 消</el-button>
        <el-button type="primary" @click="dialogTableForAddProject = false">确 定</el-button>
      </div>
      </el-dialog>
    </div>
    <!--右侧滑框 end-->
  </div>
</template>

<script>

import {groupProjectPageList, projectRelationPageList} from '@/api/projectGroup/group'

export default {
//import引入的组件
components: {},
data() {
return {
    groupId:'', //接收路由参数
    loading: false,
    rightEnter: false,
    formLabelWidth: '150px',
    queryParams:{
        groupId:'',// 项目组ID
        projectName:'',//项目名称 or 企业名称
        current: 1, // 当前页数
        size: 10 // 每页显示多少条
    },//查询项目组内项目列表参数
    dto:{
        groupId:'',//项目组ID
        instIds:[] //选择的项目数组
    },//新增项目组参数
    list:[], //项目组数据
    total: 0, // 总页数
    size: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],

    dialogTableForAddProject:false,
    queryProjectParams:{
        groupId:'',// 项目组ID
        current: 1, // 当前页数
        size: 10 // 每页显示多少条
    },//查询项目列表参数
    projectTotal:0, // 可新增项目数量总数
    projectSize: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
    projectList:[], //项目数据
    allProjectIds:[], // 汇总总选择的项目ID
    pageProjectIds:[]  //当前页选择的项目ID

};
},

created() {
    this.groupId = this.$route.query.groupId;
    this.queryParams.groupId = this.$route.query.groupId;
    this.getList()
},
//方法集合
methods: {

    getList(){
        this.loading = true
        groupProjectPageList(this.queryParams).then(response => {
          console.log(response)
          if(response.data.code=='0'){
            this.list = response.data.data.records
            this.total = response.data.data.total
            this.loading = false  
          }
        });
    },

    // 打开新增项目弹框
    openAddProjectDialog(){
      this.queryProjectParams.groupId = this.$route.query.groupId;
      this.getProjectList()
      this.dialogTableForAddProject = true
    },

    // 查询可新增项目列表参数
    getProjectList(){
      projectRelationPageList(this.queryProjectParams).then(response => {
          if(response.data.code=='0'){
            this.projectList = response.data.data.records
            this.projectTotal = response.data.data.total
            this.setCheckBox();
          }
        });
    },

    // 多选框选中数据
    handleSelectionChange(selection,row) {
      let selected = selection.length && selection.indexOf(row) !== -1
      if(!selected){
        // 取消勾选,剔除
        var i = this.allProjectIds.indexOf(row.instId);
        if(i > -1){
          this.allProjectIds.splice(i,1)
        }
        return;
      }
      this.pageProjectIds = selection.map(item => item.instId);
      // 将项目主键放入总数组中
      this.pageProjectIds.map(projectId => {
        if(this.allProjectIds.indexOf(projectId) == -1){
          this.allProjectIds.push(projectId)
        }
      });
      console.log('汇总===')
      console.log(this.allProjectIds)
      console.log('当前===')
      console.log(this.pageProjectIds)
    },


    //下面的方法是进行设置行标识key的方法
    getRowKeys(row) {
        return row.instId
    },
    // 回显选中数据
    setCheckBox(){
      if(this.projectList != null && this.projectList.length > 0 && this.allProjectIds.length > 0){
        this.allProjectIds.forEach((aId) => {
          this.$nextTick(() => {
            this.projectList.forEach((p) => {
              if(aId === p.instId){
                this.$refs.projectTableRef.toggleRowSelection(p);
              }
            })
          })
        })
      }
    },


     // 删除项目组
    del(baseId){
        this.$confirm('确认删除该条数据吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          center: true,
        }).then(() => {
           del(baseId).then(response => {
            if(response.data.code=='0'){
                this.$message({
                    type: 'success',
                    message: '删除成功!'
                });  
                this.getList()
            }
            });
          
          
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '取消删除'
          });       
        });
    },

    // 清空筛选条件
    restSearch(){
        this.queryParams.projectName = '';
        this.getList()
    },
    //关闭详情
    closePop(event) {
      this.rightEnter = false;
      //this.getList(this.page);
    },

    sizeChange(pageSize) {
     this.queryParams.size = pageSize;
     this.getList();
    },
    currentChange(current) {
      this.queryParams.current = current;
      this.getList();
    },

    sizeChangeOfProject(pageSize) {
     this.queryProjectParams.size = pageSize;
     this.getProjectList();
    },
    currentChangeOfProject(current) {
      this.queryProjectParams.current = current;
      this.getProjectList();
    },

},
//生命周期 - 挂载完成(可以访问DOM元素)
mounted() {

},
}
</script>
<style scoped>
.search-box {
  padding: 10px 20px;
  background: #fff;
  border-radius: 5px;
  margin-bottom: 10px;
}

.app-container {
  background: #f0f0f0;
  min-height: 600px;
}

.content-box {
  padding: 10px 20px;
  background: #fff;
  padding-bottom: 30px;
}

.RightSlide {
  position: absolute;
  width: 80%;
  background-color: #fff !important;
  top: 0;
  right: 0;
  bottom: 5px;
  z-index: 10;
  -webkit-box-shadow: 0px 0px 6px #ddd;
  box-shadow: 0px 0px 6px #ddd;
}

.el-tabs {
  position: absolute;
  width: 100%;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
}

.RightSlideBody .el-tabs__header {
  padding: 0 20px;
}

.RightSlideBody .el-tabs__content {
  position: absolute;
  left: 0;
  right: 0;
  top: 41px;
  bottom: 0;
}

.scroll-bar::-webkit-scrollbar {
  width: 5px;
}

.scroll-bar::-webkit-scrollbar-thumb {
  width: 5px;
  height: 10px;
  border-radius: 20px;
  background: #ddd;
}

.content-box .el-pagination {
  text-align: right;
  padding: 25px 0 20px 20px;
}
</style>
<style>
.app-container .el-table thead tr th {
  color: #909399;
  font-weight: 500;
  background-color: #fafafa !important;
}
</style>
欢迎各位大佬指正!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值