vue地址栏直接输入路由无效问题的解决


Posted in Javascript onNovember 15, 2018

vue 项目只要不是静态页面,一般都会和官方的路由管理器 vue-router 一起使用。

最近项目有一个需求,是在地址栏输入路由,跳转到对应路由组件,在开发环境中这样做是可以跳转的,但是项目打包后,通过地址栏跳转会报错。

因为 vue 在页面上显示哪个组件是根据 vue-router 进行控制的,在地址栏上直接输入路由名称,并不能触发 vue-router 的规则,所以只能通过监听地址的改变,利用回调函数在组件内部进行动态修改路由。

方式一:history 模式

vue-router 默认是 hash 模式,通过更改模式为 history 模式可以解决这个问题,但是这需要后端配合,更改服务端配置,虽然过程稍麻烦但也是一个办法,有兴趣的朋友可以查看往期文章 。

方式二:hashchange 事件

什么是 hash?

hash 就是 URL 地址中 # 字符后面的字符串。

更改它不会导致整个页面重新加载,而且可以定位到元素 id 或 name 与之相同的位置(锚点)。

window.location.hash 可以获取到 hash。比如 localhost:8080/#/abcde 的 location.hash="#/abcde"。

通过监听 hash 的状态,来动态修改 vue-router 的路由,是页面进行组件切换,这样就不会导致页面报错或 404 了。

当 hash 被修改时,将触发 hashchange 事件(IE8 +支持):

window.addEventListener('hashchange',function(e) {
  console.log(e.oldURL); 
  console.log(e.newURL)
},false);

所以在 App.vue 中添加此事件:

mounted(){
  window.addEventListener('hashchange',()=>{
    var currentPath = window.location.hash.slice(1); // 获取输入的路由
    if(this.$router.path !== currentPath){
      this.$router.push(currentPath); // 动态跳转
    }
  },false);
}

这样即可解决,在地址栏输入路由跳转无效问题。

补充:Vue路由——ie上地址栏输入路由页面不更新

情景:在ie11上从当前A页面(/a)跳转B页面(/b),在地址栏直接修改路由回车跳转B页面,发现页面还是A页面,但是地址栏地址已经是B页面地址。而且控制台并无报错。

解决方法:在App.vue中添加判断ie加手动修复:

mounted () {
      if (!!window.ActiveXObject || 'ActiveXObject' in window) {
        window.addEventListener('hashchange', () => {
          let currentPath = window.location.hash.slice(1)
          if (this.$route.path !== currentPath) {
            this.$router.push(currentPath)
          }
        }, false)
      }
    }

onhashchange事件ie8就已经支持了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
大家未必知道的Js技巧收藏
Apr 07 Javascript
JavaScript DOM学习第四章 getElementByTagNames
Feb 19 Javascript
jQuery Clone Bug解决代码
Dec 22 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
Apr 26 Javascript
自己用jQuery写了一个图片的马赛克消失效果
May 04 Javascript
JavaScript简介
Feb 15 Javascript
javascript合并表格单元格实例代码
Jan 03 Javascript
jQuery插件实现图片轮播特效
Jun 16 Javascript
详解Angular的8个主要构造块
Jun 20 Javascript
js监听html页面的上下滚动事件方法
Sep 11 Javascript
微信小程序wx:for循环的实例详解
Oct 07 Javascript
react实现复选框全选和反选组件效果
Aug 25 Javascript
微信小程序自定义toast弹窗效果的实现代码
Nov 15 #Javascript
搭建基于express框架运行环境的方法步骤
Nov 15 #Javascript
用图片替换checkbox原始样式并实现同样的功能
Nov 15 #Javascript
微信小程序swiper实现滑动放大缩小效果
Nov 15 #Javascript
微信小程序页面缩放式侧滑效果的实现代码
Nov 15 #Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 #Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
Nov 15 #Javascript
You might like
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
Python中的ConfigParser模块使用详解
2015/05/04 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
回调函数的意义以及python实现实例
2017/06/20 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
python-地图可视化组件folium的操作
2020/12/14 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
驾驶员培训方案
2014/05/01 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
工地安全质量标语
2014/06/07 职场文书
语文教育专业求职信
2014/06/28 职场文书
2014个人年度工作总结
2014/12/15 职场文书
母亲节寄语大全
2015/02/27 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript
python井字棋游戏实现人机对战
2022/04/28 Python