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 随机展示头像实现代码
Dec 06 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
Mar 13 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
Mar 25 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
JSP防止网页刷新重复提交数据的几种方法
Nov 19 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
微信小程序中做用户登录与登录态维护的实现详解
May 17 Javascript
vue input输入框模糊查询的示例代码
May 22 Javascript
vue-cli的工程模板与构建工具详解
Sep 27 Javascript
Vue表单控件绑定图文详解
Feb 11 Javascript
vue项目移动端实现ip输入框问题
Mar 19 Javascript
javascript实现动态时钟的启动和停止
Jul 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文件缓存smarty模板应用实例分析
2016/02/26 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
python列表操作实例
2015/01/14 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
Python算法之图的遍历
2017/11/16 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
学校司机岗位职责
2013/11/14 职场文书
生产车间主管岗位职责
2013/12/28 职场文书
快递业务员岗位职责
2014/01/06 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
赢在执行观后感
2015/06/16 职场文书
病假条格式范文
2015/08/17 职场文书
运动会广播稿200字
2015/08/19 职场文书