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 相关文章推荐
用js遍历 table的脚本
Jul 23 Javascript
html a标签-超链接中confirm方法使用介绍
Jan 04 Javascript
得到jQuery detach()后节点中的某个值实现代码
Feb 05 Javascript
js日期相关函数总结分享
Oct 15 Javascript
javascript框架设计之类工厂
Jun 23 Javascript
jQuery中$(function() {});问题详解
Aug 10 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
node实现简单的反向代理服务器
Jul 26 Javascript
基于Vue的ajax公共方法(详解)
Jan 20 Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 Javascript
js实现双色球效果
Aug 02 Javascript
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
php代码把全角数字转为半角数字
2007/12/10 PHP
微信公众平台天气预报功能开发
2014/07/06 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
JavaScript 面向对象之命名空间
2010/05/04 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
Python中表示字符串的三种方法
2017/09/06 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
Python跳出多重循环的方法示例
2019/07/03 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
Python socket服务常用操作代码实例
2020/06/22 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
儿科主治医生个人求职信
2013/09/23 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
2014年护士长工作总结
2014/11/11 职场文书
高一英语教学反思
2016/03/03 职场文书
同学联谊会邀请函
2019/06/24 职场文书
七年级话题作文之执着
2019/11/19 职场文书
sql查询结果列拼接成逗号分隔的字符串方法
2021/05/25 SQL Server