微信小顺序--详情页的引荐位置继承翻开详情页;返回以后分享等数据不正确题目

题目背景 — 分享的数据泉源

当前在保护的小顺序项目运用wepy开辟;分享的数据都是经由过程接口要求背景的情势取得;然后存在了数据data的对象中;相似

定义分享数据
data = {
    shareData: "", // 分享数据
    }
猎取分享数据
tip.getShareDataReci(res => {
    that.shareData = res; // 赋值背景返回的分享数据
    that.$apply();
  }, curCode); // curCode当前商品的唯一code值
运用分享数据
onShareAppMessage(res) {
  let that = this;
  if (res.from === "button") {
    // 来自页面内转发按钮
  }
  return {
    title: that.shareData.title,
    imageUrl: that.shareData.img,
    path: that.shareData.path,
    success: function(res) {
        ...
    }
}    
    

题目的发作

在大部分的电商网站都有相似的状况;在一个商品List中点击进入某一个商品概况A;然后在概况A的页面中又会有引荐的商品;这个时刻点击进入商品概况B;点击分享(不辨别右上角…分享和本身增加的分享按钮);分享的数据是本身存data内里的数据;也都是对的;症结的操纵来了;这个时刻返回商品A(不辨别右滑返回和左上角返回键和物理返回键);点击分享;会发明分享的数据仍然是商品B的信息~

题目的处置惩罚

1. 出栈的处置惩罚体式格局

在商品概况A的引荐位置;点击的时刻运用redirect出栈的体式格局去翻开概况B;这个时刻分享B是准确的;然后返回是不会到A的;由于被卸载了;直接从B回到了List;不会存在回到A今后分享数据不准确的题目~~
然则如许的处置惩罚计划带来的体验是不好的

2. 缓存读取的体式格局处置惩罚(现在在用的)

2.1 存 — 将code存缓存

第一步在商品List跳转到商品概况A的时刻;在A的onluad周期中(返回不会触发该周期)举行存储唯一code值的行动

let reciCodeList = wepy.getStorageSync("reciCodeList"); // 定义猎取的code鸠合
    if (!reciCodeList.length) {
        // 假如之前没有code则往新的数组中增加该code
      wepy.setStorageSync("reciCodeList", [].concat(options.dishCode));
    } else {
        // 假如之前有code(可能在概况A的引荐位置又进入了概况B;类推)
        // 会举行一个去重的行动;防备涌现两个一样的
      let i = utils.inArray(options.dishCode, reciCodeList);
      if (i >= 0) {
        shareData.splice(i, 1);
      }
      // 将可能举行去重处置惩罚过的数据存缓存
      wepy.setStorageSync("reciCodeList",reciCodeList.concat(options.dishCode));
    }

2.2 改 — 修正code鸠合

第二步在商品概况A的onUnload周期中(页面返回行动会触发该生命周期;页面出栈也会触发到)举行修正reciCodeList行动;此行动是为了能在返回今后拿到准确的code值

onUnload() {
    // 先猎取存储的code鸠合
    let reciCodeList = wepy.getStorageSync("reciCodeList");
    // 删除数组的末了一项(为了能在返回今后的页面拿末了一项即为当前准确项)
    /* 我是一个栗子
    在经由onluad今后会获得
    在A的时刻;存下了A的唯一code值;为reciCodeList = ['A'];
    在B的时刻;累计存下了B的唯一code值;为reciCodeList = ['A','B'];
    在C的时刻;累计存下了B的唯一code值;为reciCodeList = ['A','B','C'];
    ...
    当触发返回的时刻;会触发onUnload函数;这个时刻去删除末了一下;会获得
    在C的时刻;存储的reciCodeList = ['A','B','C'];
    这个时刻去返回;而且删除末了一项;获得了
    reciCodeList = ['A','B']; 而且页面回到了B的页面
    */
    reciCodeList.pop();
    // 存储新的鸠合
    wepy.setStorageSync("reciCodeList", reciCodeList);
  }

2.3 取 — 取到准确的code

第三步在商品概况A的onShow周期中(每次页面被显现都邑触发;返回也是被显现了)举行猎取分享数据的行动

async onShow() {
    let that = this;
    // 先猎取存储的code鸠合
    let reciCodeList = wepy.getStorageSync("reciCodeList");
    if (reciCodeList.length) {
        // 假如存在code值;则拿末了一个code值为当前code值
      let curCode = reciCodeList[reciCodeList.length - 1];
      // 当前值去发送要求;取得准确的分享数据
      tip.getShareDataReci(res => {
        that.shareData = res;
        that.$apply();
      }, curCode);
    }
  }

题目的延长

可能会涌现相似的题目;比方当前概况的分享+珍藏+差别用户展现不必信息(下有栗子);都存在返回后数据不准确的状况;也能够一并运用这个计划处置惩罚

 // 我是差别用户展现不必信息的栗子
 // 依旧运用前文的 A  B  C (概况页都有登录的进口)
 A页面是未登录状况;显现未登录状况该有的展现信息;不在A页面登录;点击引荐位置到B页面
 B页面早先显现的也是未登录状况下的展现信息;这个时刻在B页面举行了登录;回到A照样未登录的状况
 这个时刻只需要在A的onShow取一次缓存的用户信息即可
 that.userInfo = wepy.getStorageSync("userInfo");

这个是现在微信存在的bug;可先经由过程要领规避开;等微信修复了今后就乐和和了~~~

    原文作者:songxianling1992
    原文地址: https://segmentfault.com/a/1190000013780605
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞