前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bug 回忆录(四)

bug 回忆录(四)

作者头像
公众号---人生代码
发布2020-09-29 17:08:42
4120
发布2020-09-29 17:08:42
举报
文章被收录于专栏:人生代码人生代码

@author Ken @time 2020-09-27 21:30:59 @description 转载请备注出处,谢谢


bug 回忆录(四)

大家好,我是 Ken,人贱人爱的前端小 Ken,我的公众号是 前端小Ken,今天我要告诉你一个严重的问题,我发现这个奇怪的 bug,内心一万个草泥马在空中飘过,顿时心里害怕,菊花一紧:

最后我还是怂了,不得不好好认真的对待 bug。

每天一个 bug,真是应验了那句,bug 虐我千万遍,我待 bug 如初恋。

今天又是什么 bug 呢?

最近的接触了一个 svn 升级文档页面的需求:当列表查询出来之后要根据表格数据每一行的数据的 exportNumber 如果为 0 则选中,不为 0 则不选中。我想这还不简单?

经过分析,这他呀的不就是跟回显数据有点类似?有点开心

然后一顿搜索之后,出现了列表,发现一点反应都没有,一点反应都没有,what the funk? what happen? 不可能啊,一脸懵逼状态中。

我们的代码是这样处理的

搜索触发 search 方法:

代码语言:javascript
复制
/**
 * 描述
 * @date 2020-09-27
 * @description 实现搜索功能
 * @returns {undefined}
 */
search() {
  let param = JSON.parse(JSON.stringify(this.searchParams));
  param.projectNameList = param.projectNameList.toString();
  Object.assign(this.pageForm, param);

  this.searchResultParams = {
    dataInfo: JSON.parse(JSON.stringify(this.searchParams)),
    fields: this.ufd.fields,
  };
  let rv = this.onSubmit(true);
  rv !== false &&
    XM.storage.set(this.$options.name + ".sp", this.searchParams);
},

我们的请求是这样的:

代码语言:javascript
复制
/**
 * 描述
 * @date 2020-09-27
 * @param {any} isInitPages
 * @description isInitPages 是否初始化当前页码 true: 初始化为1,  false:不初始化,使用当前页码
 *  点查询时初始化当前页码, 如果不初始化,当查询出的结果集页码小于当前页码时,页码显示不正确
 * @returns {any}
 */
onSubmit(isInitPages) {
  this.pageForm.current = isInitPages ? 1 : this.pageForm.current;
  this.loading = true;
  XM.ajax.get
    .call(this, this.url, this.pageForm)
    .then((res) => {
      this.dataList = res.data.data;
      this.dataList.map((row, index) => {
        if (row.exportNumber == 0) {
          this.tempSelectResultPageDataList.push(this.dataList[index]);
          this.tempSelectResults.push(this.dataList[index]);
          this.$refs.multiTable.$refs.table.toggleRowSelection(
            this.dataList[index],
            true
          );
        }
      });
      this.pageForm.total = res.data.data.length;
    })
    .catch((err) => {
      this.loading = false;
      this.$_consoleUtils.err(err);
      this.$message.error("[" + err.status + "]" + err.msg);
    });
},

经过一顿分析之后,我们发现是因为我们的数据请求返回的时间与组件生命周期冲突的原因,为什么呢?如果数据请求比较慢,或者数据量大的情况下,你会发现,组件生命周期已经走完了,但是数据依然还没过来,所以当数据过来之后,他是不会相应到页面上去的,因此我们做了如下处理:

我们将 onSubmit 方法的处理:

代码语言:javascript
复制
this.dataList.map((row, index) => {
  if (row.exportNumber == 0) {
    this.tempSelectResultPageDataList.push(this.dataList[index]);
    this.tempSelectResults.push(this.dataList[index]);
    this.$refs.multiTable.$refs.table.toggleRowSelection(
      this.dataList[index],
      true
    );
  }
});

放在 $nextTick 里面:

代码语言:javascript
复制
this.$nextTick(() => {
  this.dataList.map((row, index) => {
    if (row.exportNumber == 0) {
      this.tempSelectResultPageDataList.push(this.dataList[index]);
      this.tempSelectResults.push(this.dataList[index]);
      this.$refs.multiTable.$refs.table.toggleRowSelection(
        this.dataList[index],
        true
      );
    }
  });
})

这样,我们的初始化选中就生效了,如下图:

当然还有一种操作就是 element-ui 官网的实现,比如我们一开始选中了一些 checkbox 多选框,后面我们下拉表格重新加载数据的时候,表格会被重新渲染一遍,会导致我们之前选中的 checkbox 多选框,又被默认渲染为没选的状态,这就很纳闷了,如果不看官网是很难实现的,

请看官网的截图:

我们发现 el-table 有一个属性 :reserve-selection="true",同时这个属性必须要结合 row-key 这个属性一起使用才有效果。

我们的表格是二次封装了 el-table 代码如下:

代码语言:javascript
复制
<fy-table
  :default-sort="{prop: 'modifiedTime', order: 'ascending'}"
  :reserve-selection="true"
  :table-data="dataList"
  :total="pageForm.total"
  @load-more="loadMore"
  @select-all="selectAll"
  @selection-change="selectionChange"
  fullScreen
  ref="multiTable"
  row-key="upgradeDocId"
  v-loading="loading"
>
  <el-table-column :width="100" type="selection"></el-table-column>

</fy-table>

因此我们就这样解决了这个 bug

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • bug 回忆录(四)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档