关于更新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
没有看的太明白。。。可否一个问题一个问题的描述
022020-12-08
相似问题