关于更新like组件状态

来源:10-4 独立更新like组件状态

易萧

2020-12-07

为什么不直接将res的状态改了。

  _setClassicData: function (res){
    likeModel.getClassicLikeStatus(res.id, res.type, (latestLike)=>{
      res.like_status = latestLike.like_status;
      res.fav_nums = latestLike.fav_nums;
      this.setData({
        classic: res,
        first: classicModel._isFirst(res.index),
        latest: classicModel._isLatest(res.index)
      });
    });
  },

以上是我的代码,和老师的有点差异,说个题外话,老师似乎很喜欢封装,但是,设置页面数据的代码明显是重复的,为什么老师并没有单独提取出来?
我想到可能是因为first和latest的原因,第一次请求并不需要去赋值,但是极端情况下如果一期期刊都没有或者只有一期,first也应该是true才对,所以我还是一视同仁地对first和latest进行赋值。
另外,getLatest的时候肯定会比老师的写法多请求一次点赞数据,但是为了一次请求去拆开写,似乎不太值得。
进入正题,
_setClassicData函数是用来设置页面数据的,不管是getLatest还是previous还是next,都直接用它作为回调函数。
比如:

  onLoad: function (options) {
    classicModel.getLatest(this._setClassicData);
  },

_setClassicData在得到了res后,并没有马上去设置页面数据,而是请求最新的点赞数据,并将点赞数据合并到刚刚的res中,然后设置页面数据。

当然,我也遇到过一些奇怪的问题,比如现在看起来代码就比较奇怪,因为设置页面数据的代码居然在getClassicLikeStatus回调中,这也是没有办法的事,因为如果这样写:

  _setClassicData: function (res){
    likeModel.getClassicLikeStatus(res.id, res.type, (latestLike)=>{
      res.like_status = latestLike.like_status;
      res.fav_nums = latestLike.fav_nums;
    });
    this.setData({
        classic: res,
        first: classicModel._isFirst(res.index),
        latest: classicModel._isLatest(res.index)
      });
  },

貌似由于异步的问题,res会写不进去,然而这并不是最奇怪的,最奇怪的如下图所示:
图片描述
932是缓存数据,933是被重新设置的数据,这就很奇怪,预览内容和展开内容还能不一致??
我知道,异步嘛,可能就是那边还没得到数据,这边就开始设置了,但是,设置要么成功要么失败才对吧。
直接打印设置后的classic也是这样,就像是影子没跟得上一样。
为什么会出现这种不一致的问题呢,既然有933,说明在设置代码前,肯定是得到了数据的,那么这个933到底给了谁呢。

好吧,我已经不是很关心它了,或许是底层机制的缘故,但它确实是异步导致的,虽然出于无奈把它写进了getClassicLikeStatus回调中,但至少也不用去妥协新增两个变量吧,如果一个页面同时有非常多的实时数据和缓存数据,岂不是要新增N个变量?

写回答

1回答

7七月

2020-12-08

没有看的太明白。。。可否一个问题一个问题的描述

0
2
7七月
回复
易萧
这个其实都可以。。。写法习惯问题。
2020-12-08
共2条回复

纯正商业级微信小程序应用实战,全方位小程序特性讲解

真实数据的高质量小程序项目,学会直接工作

4782 学习 · 2125 问题

查看课程