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 相关文章推荐
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
May 25 Javascript
javascript 面向对象全新理练之数据的封装
Dec 03 Javascript
用Mootools获得操作索引的两种方法分享
Dec 12 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
Dec 28 Javascript
往光标所在位置插入值的js代码
Sep 22 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
JS烟花背景效果实现方法
Mar 03 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
Sep 04 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
Dec 20 Javascript
jQuery限制图片大小的方法
May 25 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
js中对象和面向对象与Json介绍
Jan 21 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
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
繁简字转换功能
2006/07/19 Javascript
javascript String 的扩展方法集合
2008/06/01 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
python实现图片筛选程序
2018/10/24 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
英国婴儿和儿童服装网站:Vertbaudet
2018/04/02 全球购物
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
社区端午节活动方案
2014/01/28 职场文书
学校元旦晚会方案
2014/02/19 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
2014年维稳工作总结
2014/11/18 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
商务信函英语问候语
2015/11/10 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL