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 多行滚动代码(附详细解释)
Jun 17 Javascript
jQuery ajax cache缓存问题
Jul 01 Javascript
JavaScript 验证码的实例代码(附效果图)
Mar 22 Javascript
用jQuery模拟select下拉框的简单示例代码
Jan 26 Javascript
javascript实现的多个层切换效果通用函数实例
Jul 06 Javascript
跟我学习javascript的全局变量
Nov 16 Javascript
学习vue.js条件渲染
Dec 03 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
Feb 22 Javascript
服务端预渲染之Nuxt(使用篇)
Apr 08 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
May 22 Javascript
js实现贪吃蛇小游戏
Oct 29 Javascript
JS JQuery获取data-*属性值方法解析
Sep 01 jQuery
微信小程序实现运动步数排行功能(可删除)
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与XML联手进行网站编程代码实例
2008/07/10 PHP
php设计模式  Command(命令模式)
2011/06/17 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
2018/08/10 PHP
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python的词法分析与语法分析
2013/05/18 Python
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
详解Python3.1版本带来的核心变化
2015/04/07 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
Python class的继承方法代码实例
2020/02/14 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
最受欢迎的自我评价
2013/12/22 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
新教师2015年度工作总结
2015/07/22 职场文书