elementUI的table翻页记录功能实现

分享一下elementUI在vue里如何实现记忆回显数据已选中选项

  前言: 回显table数据,有很多种方式,这里将用两种方法讲解table表中选中项的回显,第一种方式适合分页数据的回显,第二种更适合单条数据的回显。

   需要回显的原因:table表分页,是在点击下一页会获取新一页的数据,在点击上一页,数据是重新请求的,因此若第一页有选中状态,点击任何页在回到第一页,选中状态会消失

  1.利用elementUI官网的row-key实现数据的回显

         数据回显的关键性使用一个row-key标识每一条数据,因此标识的值要是惟一的, 一个是reserve-selection,这个是elementUI自己定义的属性,会自带记忆功能,实现起来简单也很好理解

 

    一起来看一下页面数据吧,值得注意的是row-key是在table上,而reserve-selection是写在type为seleciton的标签上

<div class="table">
   <el-table
      ref="multipleTable"
      :data="tableData"
      style="width: 100%"
      :row-key="getRowKey"
      @selection-change="changeSelect"
       >
    <el-table-column type="selection" width="55" :reserve-selection="true"></el-table-column>
      <el-table-column label="日期" 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-column prop="address" label="地址" show-overflow-tooltip></el-table-column>
      </el-table>
      </div>
      <div class="pages">
        <el-pagination layout="prev, pager, next" :total="50" @current-change="changeCurrent"></el-pagination>
      </div>
    </section>
  </div>

    下面是js部分,js部分也是及其简单,这里因为row-key是方法,所以是反的,也可以直接row-key=''date'

export default {
  data() {
    return {
      tableData: [],
      multipleSelection: []
    };
  },
  methods: {
    getRowKey(row) {
      return row.date;
    },
    changeCurrent(val) {
    },
    changeSelect(selection) {
      console.log(selection);
    }
  }
};

    总结: 这个方法只需要要绑定两个属性就可以实现回显

 2.利用toggleRowSelection实现回显

    其实toggleRowSelection更加适合于单条数据的回显,会很快,但是用它来实现分页table的数据回显就会有很多小坑的地方,有兴趣的可以了解一下

   this.$refs.tableList.toggleRowSelection(this.tableData[i], true);  === 单条数据的回显

  下面开始讲一下用toggleRowSelection实现table分页回显

 实现分页功能很重要的一个方法 - toggleRowSelection

 也就是说,将页面显示的数据,要选中的行使用toggleRowSelection

下面开始说实现的整个过程(边写边踩坑)

先简单说下实现逻辑 -

     将每页点击的数据保存下来,当页页面数据请求成功,对比请求数据和自己保存的数据,利用toggleRowSelection将数据回显

1.界面部分

   <el-table
            :data="tableData"
            ref="tableList"
            border
            style="width: 100%"
            class="chargeDetailT"
            @selection-change="handleSelectionChange"
          >
   <el-table-column type="selection" width="45" porp="checkSate"></el-table-column>
   <el-table-column fixed prop="orderNo" label="用户充电订单号"></el-table-column>
   <el-table-column prop="startChargeSeq" label="充电桩交易订单号"></el-table-column>
   <el-table-column prop="equipmentName" label="充电桩" width="180"></el-table-column>
   <el-table-column prop="operatorName" label="运营商" width="120"></el-table-column>
   <el-table-column prop="totalPower" label="充电电量(kv)" width="120"></el-table-column>
   <el-table-column prop="customerBalanceMoney" label="充电金额(元)"></el-table-column>
   <el-table-column prop="createTime" label="创建时间" width="125"></el-table-column>
  
 </el-table>

绑定selection-change事件 -  当选择项发生变化时会触发该事件,它会自带一个参数,参数是当前页选中的数组,只需要将数组直接保存下来就行了

 getNum() {
      let sum  = 0;
      if (this.vTable) {
        for (let key in this.vTable) {
          sum += this.vTable[key].length;
        }
      }
      this.num = sum;
    },

 handleSelectionChange(val) {
      if (event === undefined || event.target.nodeName === 'INPUT') {
        this.vTable['v_' + this.currentPage] = [...val];
        this.getNum();
      }
    },

小的知识点 -

如果是直接将一行的数据row存在数组Vtable,则每次点击任何一页都循环数组,若第一页你选中了100条,第二页又点了100条,回到第一页,要循环200,其实对于我们来说,只需要100条就可以了,所以这个时候,用到对象数组,这样子点击哪一页就循环那一页的部分,性能上会提升

注意坑的部分 -

在elmentUi中,点击分页的事件和这个事件存在耦合性,也是说,他会在点击分页获取数据触发完毕会立即触发selection-change,会导致一个问题,再次点击第一页,会触发事件,这个时候的val是null,即还未回显数据,你的回显的数据已经被置为null,则永远不会进行回显

2.回显数据部分

  rowMultipleChecked() {
      if (this.vTable['v_' + this.currentPage] && this.vTable['v_' + this.currentPage].length > 0) {
        let id =  this.vTable['v_' + this.currentPage].map(row => {
          return row.id;
        });
        for (var i = 0; i < this.tableData.length; i++) {
          if (id.includes(this.tableData[i].id)) {
            //回显数据
            this.$refs.tableList.toggleRowSelection(this.tableData[i], true);
          }
        }
      }

    },

   async showList() {
      let res = await unAccountList(this.currentPage, this.pagesize);
      this.tableData = res.rows;
      this.total = res.total;
      this.$nextTick(() => {
        if (this.$refs.tableList) {
          this.rowMultipleChecked();
        }
      });
    },

回显数据 -分两步 - 获取数据。对比数据回显数据

注意:回显的是显示在界面的数据

 又要注意新坑了 - 回显数据的时候,一定要界面更新完成之后再回显 - 所以用了$nextTick

总结 - 回显,主要就是toggleRowSelection,用这个方法进行回显和记忆

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值