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 相关文章推荐
EditPlus注册码生成器(js代码实现)
Mar 25 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
Dec 12 Javascript
用JavaScript实现页面重定向功能的教程
Jun 04 Javascript
理解Javascript的call、apply
Dec 16 Javascript
ES6的新特性概览
Mar 10 Javascript
利用VUE框架,实现列表分页功能示例代码
Jan 12 Javascript
用director.js实现前端路由使用实例
Jan 27 Javascript
Node.js和Express简单入门介绍
Mar 24 Javascript
微信小程序wxs实现吸顶效果
Jan 08 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
Feb 06 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
Jul 29 Javascript
详解VUE中的插值( Interpolation)语法
Oct 18 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
使用无限生命期Session的方法
2006/10/09 PHP
PHP制作图型计数器的例子
2006/10/09 PHP
php完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
Jquery中删除元素的实现代码
2011/12/29 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
Python中的自定义函数学习笔记
2014/09/23 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
外贸学院会计专业应届生求职信
2013/11/14 职场文书
小学语文业务学习材料
2014/06/02 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
师德师风个人总结
2015/02/06 职场文书
2015年司法所工作总结
2015/04/27 职场文书