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 相关文章推荐
Extjs TimeField 显示正常时间格式的代码
Jun 28 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
Oct 26 Javascript
DOM基础教程之使用DOM
Jan 19 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
Sep 06 Javascript
微信小程序 前端源码逻辑和工作流详解
Oct 08 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
Node.js查找当前目录下文件夹实例代码
Mar 07 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
Nov 27 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
Sep 25 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
Dec 10 Javascript
Vue.js中该如何自己维护路由跳转记录
May 19 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
一个查看session内容的函数
2006/10/09 PHP
BBS(php & mysql)完整版(四)
2006/10/09 PHP
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
php限制文件下载速度的代码
2015/10/20 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
获取Django项目的全部url方法详解
2017/10/26 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
给物业的表扬信
2014/01/21 职场文书
安全生产检查通报
2014/01/29 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
英文版辞职信
2015/02/28 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL