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 相关文章推荐
javascript不同页面传值的改进版
Sep 30 Javascript
鼠标事件延时切换插件
Mar 12 Javascript
JQuery入门——事件切换之hover()方法应用介绍
Feb 05 Javascript
JavaScript中按位“异或”运算符使用介绍
Mar 14 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
Dec 29 Javascript
javascript事件冒泡简单示例
Jun 20 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
Jul 24 Javascript
vue移动端实现下拉刷新
Apr 22 Javascript
微信小程序实现即时通信聊天功能的实例代码
Aug 17 Javascript
jQuery实现的简单手风琴效果示例
Aug 29 jQuery
浅谈关于iview表单验证的问题
Sep 29 Javascript
通过实例了解JS 连续赋值
Sep 24 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
PHP学习之正则表达式
2011/04/17 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
python获取mp3文件信息的方法
2015/06/15 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python探索之ModelForm代码详解
2017/10/26 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
使用TensorFlow实现SVM
2018/09/06 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
手术室护士自我鉴定
2013/10/14 职场文书
学前教育学生自荐信范文
2013/12/31 职场文书
十佳护士先进事迹
2014/05/08 职场文书
公司证明怎么写
2014/09/22 职场文书
2016学习医德医风心得体会
2016/01/25 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
Python学习之迭代器详解
2022/04/01 Python
Python实现为PDF去除水印的示例代码
2022/04/03 Python
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js