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 相关文章推荐
jQuery使用手册之三 CSS操作
Mar 24 Javascript
js截取字符串的两种方法及区别详解
Nov 05 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
Jan 14 Javascript
angularJS 中input示例分享
Feb 09 Javascript
JavaScript 对象深入学习总结(经典)
Sep 29 Javascript
jquery按回车键实现表单提交的简单实例
May 25 Javascript
JavaScript 数据类型详解
Mar 13 Javascript
JavaScript中清空数组的三种方式
Mar 22 Javascript
Angularjs单选框相关的示例代码
Aug 17 Javascript
浅谈AngularJS中$http服务的简单用法
May 15 Javascript
基于node.js实现爬虫的讲解
Feb 18 Javascript
Vue vee-validate插件的简单使用
Jun 22 Vue.js
微信小程序实现运动步数排行功能(可删除)
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返回json数据函数实例
2014/10/09 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
一个可以显示阴历的JS代码
2007/03/05 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
2016/01/14 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
python音频处理的示例详解
2020/12/23 Python
快递业务员岗位职责
2014/01/06 职场文书
团日活动总结书
2014/05/08 职场文书
中层干部培训方案
2014/06/16 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
微信小程序调用python模型
2022/04/21 Python
python使用shell脚本创建kafka连接器
2022/04/29 Python