微信小程序--详情页的推荐位置继续打开详情页;返回之后分享等数据不正确问题
问题背景 -- 分享的数据来源
当前在维护的小程序项目使用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;可先通过方法规避开;等微信修复了以后就乐呵呵了~~~
微信小程序--详情页的推荐位置继续打开详情页;返回之后分享等数据不正确问题的更多相关文章
- 【转】精选十二款餐饮、快递、票务行业微信小程序源码demo推荐
微信小程序的初衷是为了线下实体业服务的,必须有实体相结合才能显示小程序的魅力.个人认为微信小程序对于餐饮业和快递业这样业务比较单一的行业比较有市场,故整理推荐12款餐饮业和快递业微信小程序源码demo ...
- python flask框架学习(三)——豆瓣微信小程序案例(一)templates的使用,宏的使用,前端后台传数据,前端写python语句
目录 一.templates的使用 (1)在templates里创建一个index.html (2)再在app.py里写 (3)展示效果 二.构建第一个电影评分 (1)准备好素材放进static里的i ...
- 微信小程序经纬度转化为具体位置(逆地址解析)
小程序wx.getLocation只能获取经纬度, 这时候想要具体地址就需要借助第三方sdk(逆地址解析) 我这边第三方以腾讯位置服务举例 一. 首先小程序需要申请wx.getLocation接口权限 ...
- 微信小程序页面滚动到指定位置
页面上有一个元素或者组件,id 为 comment 则: var me = this; var query = wx.createSelectorQuery().in(me); query.selec ...
- 微信小程序 - scroll-view的scroll-into-view属性 - 在页面打开后滚动到指定的项
需求: 这是一个可横向滚动的导航条,现在要求我,从别的页面reLaunch回到首页这里,刷新页面内容的同时,菜单项要滚动出来 (如果该菜单项不在可视区域),而不是让他被挡住. 代码:<scrol ...
- 微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
1. movable-view组件具体内容可参考官网:微信官方文档 2. demo参考:https://github.com/ChinaFanny/YFWeappMovableView 运行效果 核心 ...
- 微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)
这里主要用到了swiper组件和三目运算,直接上代码, 样式只有三个class,简单粗暴,懒的小伙伴们可以直接拿来用,喜欢的点个支持 <view> <view class=" ...
- 微信小程序云开发-云存储-下载并打开文件文件(word/excel/ppt/pdf)
一.wxml文件 1.写文本框,用来获取文件链接. 2.按钮,点击下载文件 <!-- 下载文件(word/excel/ppt/pdf等) --> <view class=" ...
- 微信小程序源码推荐
wx-gesture-lock 微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...
随机推荐
- 怎样将DataGrip连接到MS SQL Server?
DataGrip支持几乎所有主流的关系数据库产品,如DB2.Derby.H2.MySQL.Oracle.PostgreSQL.SQL Server.Sqllite及Sybase等,并且提供了简单易用的 ...
- OpenStack组件——Nova计算资源管理
1.nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...
- eve-ng
eve-ng eve-ng采用的是和web-iou一样的B/S模式,进步的地方是它只需拖动鼠标就可以搭建拓朴,比web-iou要直观. 此虚拟机已经集成了IOL的L2.L3以及vIOS的L ...
- 树莓派3 安装kali注意事项(无需显示器、键鼠连接树莓派)2017/9/18更新
kali系统树莓派专用版下载地址https://www.offensive-security.com/kali-linux-arm-images/ 官方下载页面https://www.kali.or ...
- ASP.NET Core中使用EF Core(MySql)Code First
⒈添加依赖 MySql.Data.EntityFrameworkCore ⒉在appsettings.json配置文件中配置数据库连接字符串 { "Logging": { &quo ...
- Eratosthenes筛法
复杂度为nlogn. 算法思想为:枚举1~sqrt(n),然后把每一个数的倍数都都打上不是素数的标记. 还要特别注意0,1不是素数,打标记枚举到i*k<=n. 代码如下 #include< ...
- 双指针(最大删除子串)Codeforces Round #579 (Div. 3)--Remove the Substring (hard version)
题目链接:https://codeforces.com/contest/1203/problem/D2 题意: 给你S串.T串,问你最长删除多长的子串使得S串里仍然有T的子序列. 思路: 想了好久,先 ...
- Radio stations CodeForces - 762E (cdq分治)
大意: 给定$n$个三元组$(x,r,f)$, 求所有对$(i,j)$, 满足$i<j, |f_i-f_j|\le k, min(r_i,r_j)\ge |x_i-x_j|$ 按$r$降序排, ...
- redis 学习(15)-- GEO
GEO GEO 简介 Redis 3.2添加新特性 功能:存储经纬度.计算两地距离.范围计算等 基于ZSet实现 删除操作使用 zrem key member GEO 相关命令 1.geoadd ke ...
- leecode刷题(31) -- 回文数
leecode刷题(31) -- 回文数 回文数 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输 ...