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 相关文章推荐
ExtJs之带图片的下拉列表框插件
Mar 04 Javascript
获取dom元素那些讨厌的位置封装代码
Jun 23 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
Jun 23 Javascript
浅析Node.js中的内存泄漏问题
Jun 23 Javascript
JavaScript解八皇后问题的方法总结
Jun 12 Javascript
jQuery中绑定事件bind() on() live() one()的异同
Feb 23 Javascript
在Vue中使用echarts的实例代码(3种图)
Jul 10 Javascript
ES6下子组件调用父组件的方法(推荐)
Feb 23 Javascript
js实现div色块碰撞
Jan 16 Javascript
微信小程序复选框实现多选一功能过程解析
Feb 14 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
Jul 11 Javascript
使用Vant完成通知栏Notify的提示操作
Nov 11 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 SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
php 基础函数
2017/02/10 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
json数据的列循环示例
2013/09/06 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
js实现每日签到功能
2018/11/29 Javascript
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
Python中的startswith和endswith函数使用实例
2014/08/25 Python
python装饰器decorator介绍
2014/11/21 Python
Python中的作用域规则详解
2015/01/30 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
详解python之协程gevent模块
2018/06/14 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
个人现实表现材料
2014/02/04 职场文书
入股协议书范本
2014/04/14 职场文书
卖车协议书
2014/04/21 职场文书
中学生励志演讲稿
2014/04/26 职场文书
庆六一活动总结
2014/08/29 职场文书
股东合作协议书
2014/09/12 职场文书
房地产销售助理岗位职责
2015/04/14 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
Redis实现分布式锁的五种方法详解
2022/06/14 Redis