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 相关文章推荐
经典海量jQuery插件 大家可以收藏一下
Feb 07 Javascript
jquery+json 通用三级联动下拉列表
Apr 19 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
Aug 30 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
Mar 27 Javascript
Vue.js 实现数据展示全部和收起功能
Sep 05 Javascript
cnpm加速Angular项目创建的方法
Sep 07 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
Feb 20 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
May 11 Javascript
原生JavaScript实现刮刮乐
Sep 29 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面向对象全攻略 (九)访问类型
2009/09/30 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
jquery 常用操作方法
2010/01/28 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
js获取字符串字节数方法小结
2015/06/09 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
Python input函数使用实例解析
2019/11/22 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
环境卫生标语
2014/06/09 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
初中班主任教育随笔
2015/08/15 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript