当前位置: 首页 > Web前端 > HTML

微信小程序--详情页推荐位置继续打开详情页;返回后分享等数据不正确的问题

时间:2023-04-02 11:10:16 HTML

问题背景——共享数据的来源。目前维护的小程序项目是使用wepy开发的;通过请求后台的接口获取共享数据;然后存储在数据对象中;类似定义共享数据data={shareData:"",//共享数据}获取共享数据tip.getShareDataReci(res=>{that.shareData=res;//赋值后台返回的共享数据that.$apply();},当前代码);//curCode当前产品使用分享数据的唯一代码值onShareAppMessage(res){letthat=this;if(res.from==="button"){//从页面中的前进按钮}return{title:that.shareData.title,imageUrl:that.shareData.img,path:that.shareData.path,success:function(res){...}}大部分电商网站都会出现这个问题,也有类似的情况;在产品列表中,点击进入某A产品详情A;然后在详情A的页面会有推荐的商品;此时点击进入产品详情B;点击分享(不要区分右上角...分享和自己添加的分享按钮);共享数据是自己在数据中保存的数据;这也是正确的;关键操作来了;此时返回产品A(不区分右滑返回和左上角的返回按钮和实体返回按钮);点击分享;你会发现共享的数据依然是产品B的信息~问题的解决方案1.堆栈的解决方案在产品详情A的推荐位置;点击时,使用redirect方法打开堆栈打开详情B;此时,分享B是正确的;然后returnisnot会去A;因为它已被卸载;直接从B返回List;不会有返回A后数据共享不正确的问题~~但是这样的方案带来的体验并不好2.缓存读取方案(目前正在使用)2.1保存--缓存代码第一步是当产品列表跳转到商品详情A;将唯一码存入A的onluad循环(return不会触发本次循环)valueactionletreciCodeList=wepy.getStorageSync("reciCodeList");//定义获取的代码集合if(!reciCodeList.length){//如果之前没有代码,则将代码添加到新数组中wepy.setStorageSync("reciCodeList",[].concat(options.dishCode));}else{//如果之前有代码(可能是在detailA的推荐位置,输入了detailB;等等)//会执行去重动作;防止两个相同的leti=utils.inArray(options.dishCode,reciCodeList);如果(i>=0){shareData.splice(i,1);}//缓存可能去重的数据wepy.setStorageSync("reciCodeList",reciCodeList.concat(options.dishCode));}2.2Change--修改代码集合第二步修改ProductDetailsA的onUnload循环中的reciCodeList(页面返回动作会触发这个生命周期,弹出页面也会触发)修改reciCodeList动作;这个动作是返回后获取正确的code值onUnload(){//先获取存储的codesetletreciCodeList=wepy.getStorageSync("reciCodeList");//删除数组的最后一项(对于return后页面上的最后一项就是当前正确的项)/*我是栗子,onluad后会进入A;保存A的唯一编码值;reciCodeList=['A'];在B时;累加B的唯一编码值;对于reciCodeList=['A','B'];当在C时:累加B的唯一码值;对于reciCodeList=['A','B','C'];...当触发器返回时;onUnload函数将被触发;此时删除最后一个;你会得到在C中时;存储的reciCodeList=['A','B','C'];此时返回;并删除最后一项;获取reciCodeList=['A','B'];并且页面返回到B*/reciCodeList.pop()的页面;//存储一个新集合wepy.setStorageSync("reciCodeList",reciCodeList);}2.3Fetch--获取正确代码第三步在商品详情的onShowA循环中(每次显示页面时触发;返回也显示)获取共享数据的动作asynconShow(){let那=这个;//首先获取存储的代码集合letreciCodeList=wepy.getStorageSync("reciCodeList");if(reciCodeList.length){//如果有代码值;然后将最后一个代码值作为当前代码值letcurCode=reciCodeList[reciCodeList.length-1];//发送带有当前值的请求;获取正确的共享数据tip.getShareDataReci(res=>{that.shareData=res;that.$apply();},curCode);问题的扩展可能会出现类似的问题;比如分享当前详情+收藏+不同用户显示未使用的信息(下面有栗子);存在返回后数据不正确的情况;也可以用这个方案来处理//我是个栗子针对不同用户显示未使用的信息//还是用之前的ABC(详情页有登录入口)A页面是unlogged状态;显示未登录状态下应显示的显示信息;不要在A页面登录;点击推荐位置进入B页;页面已登录;回到A还没有登录的状态,这时候只需要在A的onShow中取一次缓存的用户信息即可that.userInfo=wepy.getStorageSync("userInfo");这就是目的之前的微信有bug;您可以先通过方法避免它们;微信修好了,你就开心了~~~