vue单页面在微信下只能分享落地页的解决方案


Posted in Javascript onApril 15, 2019

实际上关键词叫 微信pushState只能分享落地页 更贴切一点

应用场景:

  1. vue + vue-router
  2. vue-router使用hash模式(history模式没试过)
  3. 不使用微信的js-sdk(因为我这个项目是可配置域名的商城,比较特殊,不能使用微信sdk)

这个方案并不是最优秀的,会对性能造成一定的影响

HTML5 history.pushState

vue-router的内部是通过 history.pushState 和 history.replaceState 实现的。但是iOS设备的微信浏览器不会去检测它们的变化。但是我们可以通过更新 location.href 让微信浏览器识别到当前的url。

// vue-router/src/util/push-state.js

export function pushState (url?: string, replace?: boolean) {
 saveScrollPosition()
 // try...catch the pushState call to get around Safari
 // DOM Exception 18 where it limits to 100 pushState calls
 const history = window.history
 try {
  if (replace) {
   history.replaceState({ key: _key }, '', url)
  } else {
   _key = genKey()
   history.pushState({ key: _key }, '', url)
  }
 } catch (e) {
  window.location[replace ? 'replace' : 'assign'](url)
 }
}

export function replaceState (url?: string) {
 pushState(url, true)
}

解决方法

window.location.href = window.location.href ,这段代码可以让微信记录当前的url,且不会刷新页面。可以在app.vue中 watch $route 在每次页面更新的时候执行一次。

// app.vue

watch: {
 $route: {
  immediate: true,
  deep: true,
  handler(to) {
   // 微信浏览器判断
   const WECHAT_BROWSER = navigator.userAgent.toLowerCase().includes('micromessenger')

   // 解决iOS微信浏览器分享地址只能是落地页的问题,这个操作是不会刷新页面的,query参数改变也会执行
   if (WECHAT_BROWSER) {
    // eslint-disable-next-line
    window.location.href = window.location.href
   }
  }
},

使用了上述方法可以解决这个问题,但是这会引出一个很奇葩的问题,在真机上进入 http://192.168.1.5:8080 和 http://192.168.1.5:8080/#/ 这两个页面,其中有一个链接的bug依然存在。原因具体不清楚,经过测试可以在入口文件(main.js)中在页面还没有展示内容前刷新一次页面,即可解决这个问题。

// main.js

// 微信浏览器判断
const WECHAT_BROWSER = navigator.userAgent.toLowerCase().includes('micromessenger')

// 在url插入的search参数,可以随意,但是必须要
// 例:http://192.168.1.5:8080/?_wx_=1#/
const wxQuery = '_wx_=1'
const isRepeatQuery = location.search.includes(wxQuery)
if (WECHAT_BROWSER && !isRepeatQuery) {
 const unit = (location.search && location.search !== '?') ? '&' : '?'
 location.search += unit + wxQuery  // 添加_wx_参数,该操作会刷新页面
}

上面的代码之所以要在 hash 前面加一个 ?_wx_=1 参数,为了方便刷新页面给一个标志位判断是否已刷新。参数的 key-value 随意。

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

Javascript 相关文章推荐
JavaScript 以对象为索引的关联数组
May 19 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
Dec 27 Javascript
调用DOM对象的focus使文本框获得焦点
Feb 19 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
Oct 28 Javascript
jquery平滑滚动到顶部插件使用详解
May 08 jQuery
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
Jun 20 Javascript
微信小程序组件 marquee实例详解
Jun 23 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
Aug 20 Javascript
eslint+prettier统一代码风格的实现方法
Jul 22 Javascript
详解JavaScript作用域、作用域链和闭包的用法
Sep 03 Javascript
vue--vuex详解
Apr 15 #Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
Apr 15 #Javascript
小程序数据通信方法大全(推荐)
Apr 15 #Javascript
前端面试知识点目录一览
Apr 15 #Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
Apr 15 #Javascript
vue-cli项目使用mock数据的方法(借助express)
Apr 15 #Javascript
说说Vuex的getters属性的具体用法
Apr 15 #Javascript
You might like
在JavaScript中调用php程序
2009/03/09 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
JavaScript 空位补零实现代码
2010/02/26 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
django允许外部访问的实例讲解
2018/05/14 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
Python读取stdin方法实例
2019/05/24 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
公司市场部岗位职责
2013/12/02 职场文书
五型班组建设方案
2014/02/10 职场文书
新年团拜会主持词
2014/04/02 职场文书
公司外出活动方案
2014/08/14 职场文书
大学生实习证明范本
2014/09/19 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
技术入股协议书
2016/03/22 职场文书
利用Python多线程实现图片下载器
2022/03/25 Python
vue3不同环境下实现配置代理
2022/05/25 Vue.js
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL