vue-router history模式下的微信分享小结


Posted in Javascript onJuly 05, 2018

背景

旧项目改造,进行前后端分离。做成了spa,为了保证后端路由时期链接可用性,使用了history模式。

因为不同的页面有不同的分享内容,所以每次路由都要重新进行wx.config/wx.ready调用

微信分享遇到的坑

微信官方文档上有下面一段话:

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)

在实际测试和大量真实数据收集后发现,Android4.4+都是支持pushState的。也就是说,没有遇到官方文档所述的问题。(此番调研后才决定采用history模式进行实施的,导致IOS下踩了坑)

IOS下遇到了问题:

# 打开页面时分享没有问题,路由一次之后再分享签名错误(invalid signature)

这个问题是由于IOS微信浏览器下,有着下面的“特性”:

把第一次打开的页面叫做进入页;把前端路由若干次跳转(通过pushState/replaceState改变url)之后,当前打开的页面叫做当前页。

微信验签使用的url(当前网页的URL,不包含#及其后面部分),在Android下取的是当前页url,在IOS下取的是进入页的url(支付目录也是一样)

知道了这个,可以采取下面的办法来解决:

使用vuex保存进入页的URL,每次wx.config需要的参数,都使用进入页的URL来进行签名

至此,微信分享签名错误的问题解决了,但分享还是不正常:# 自定义分享不生效

度娘谷歌了一番,大概有下面几种办法

  • 使用hash模式
  • 做成多页应用,每个页面都是进入页
  • 所有需要自定义分享的页面使用<a>替换<router-link>,跟2类似,使所有自定义分享页面变成进入页

对于我们的业务场景来说,hash模式不能保证历史链接的可用性,多页/<a>跳转都是以牺牲一定体验性为代价。

经过多番尝试,最后发现用下面的方法勉强解决了问题:

// 进入页面,控制自定义分享前,把当前页URL替换成进入页的URL(保证自定义分享正常)
this.setCurrentPage(location.href)
window.history.replaceState({}, document.title, this.landingPage)
wx.config()
wx.ready()

//...

// 离开当前页时,还原当前页的URL(保证返回正常)
beforeRouteLeave(to, from, next) {
  window.history.replaceState({}, '', this.currentPage)
  next()
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js+css在交互上的应用
Jul 18 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
Sep 10 Javascript
ext前台接收action传过来的json数据示例
Jun 17 Javascript
jQuery使用CSS()方法给指定元素同时设置多个样式
Mar 26 Javascript
移动开发之自适应手机屏幕宽度
Nov 23 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
Nov 30 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
JavaScript和jQuery制作光棒效果
Feb 24 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
Nov 22 Javascript
vue 根据数组中某一项的值进行排序的方法
Aug 30 Javascript
微信小程序tabBar设置实例解析
Nov 14 Javascript
详解JS函数防抖
Jun 05 Javascript
微信小程序实现运动步数排行功能(可删除)
Jul 05 #Javascript
微信小程序之批量上传并压缩图片的实例代码
Jul 05 #Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 #Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 #jQuery
JavaScript递归函数解“汉诺塔”算法代码解析
Jul 05 #Javascript
微信小程序开发之改变data中数组或对象的某一属性值
Jul 05 #Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
Jul 05 #Javascript
You might like
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
师德学习感言
2014/01/31 职场文书
表扬稿范文
2015/01/17 职场文书
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python