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 相关文章推荐
从数据结构的角度分析 for each in 比 for in 快的多
Jul 07 Javascript
jquery阻止冒泡事件使用模拟事件
Sep 06 Javascript
js 将json字符串转换为json对象的方法解析
Nov 13 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
Aug 18 Javascript
浅谈js的ajax的异步和同步请求的问题
Oct 07 Javascript
Vue实现百度下拉提示搜索功能
Jun 21 Javascript
vue教程之toast弹框全局调用示例详解
Aug 24 Javascript
微信小程序-form表单提交代码实例
Apr 29 Javascript
了解javascript中的Dom操作
May 27 Javascript
详解在Angular4中使用ng2-baidu-map的方法
Jun 19 Javascript
node.js制作一个简单的登录拦截器
Feb 10 Javascript
JavaScript实现一键复制内容剪贴板
Jul 23 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
新闻分类录入、显示系统
2006/10/09 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
Bootstrap每天必学之栅格系统(布局)
2015/11/25 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
vuejs指令详解
2017/02/07 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
python实现桌面壁纸切换功能
2019/01/21 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
vue项目实现分页效果
2021/03/24 Vue.js
求职简历自荐信
2013/10/20 职场文书
优秀护士获奖感言
2014/02/20 职场文书
法律进机关实施方案
2014/03/12 职场文书
2015年司法所工作总结
2015/04/27 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
财务管理制度范本
2015/08/04 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫