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与函数式编程解释
Apr 27 Javascript
Js基础学习资料
Nov 23 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
Dec 06 Javascript
js控制input输入字符解析
Dec 27 Javascript
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
原生javascript实现Tab选项卡切换功能
Jan 12 Javascript
深入分析javascript中的错误处理机制
Jul 17 Javascript
vue解决一个方法同时发送多个请求的问题
Sep 25 Javascript
webpack 开发和生产并行设置的方法
Nov 08 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
JavaScript碰撞检测原理及其实现代码
Mar 12 Javascript
在vue中import()语法不能传入变量的问题及解决
Apr 01 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
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
使用python实现滑动验证码功能
2019/08/05 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
大学活动总结范文
2014/04/29 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
2015年度党员个人总结
2015/02/14 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
初中运动会前导词
2015/07/20 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers