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 相关文章推荐
javascript 全等号运算符使用说明
May 31 Javascript
input按钮的事件处理大全
Dec 10 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
AngularJS身份验证的方法
Feb 17 Javascript
Bootstrap每天必学之警告框插件
Apr 26 Javascript
jquery分隔Url的param方法(推荐)
May 25 Javascript
JS常见算法详解
Feb 28 Javascript
详解Vue SPA项目优化小记
Jul 03 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 Javascript
Javascript读写cookie的实例源码
Mar 16 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
Apr 23 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的远程图片抓取函数分享
2013/09/25 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
php实现用户登陆简单实例
2017/04/04 PHP
万能的php分页类
2017/07/06 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
pycharm修改file type方式
2019/11/19 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
银行存款证明样本
2014/01/17 职场文书
超市创业计划书
2014/04/24 职场文书
火锅店的活动方案
2014/08/15 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
国王的演讲观后感
2015/06/03 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
进行数据处理的6个 Python 代码块分享
2022/04/06 Python
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB