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 相关文章推荐
同一页面多个商品倒计时JS 基于面向对象的javascript
Feb 16 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
Apr 02 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
Sep 11 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
Mar 05 Javascript
如何实现json数据可视化详解
Nov 24 Javascript
jquery实现左右滑动式轮播图
Mar 02 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
Nov 30 Javascript
vue 父组件调用子组件方法及事件
Mar 29 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
Sep 14 Javascript
Angular封装搜索框组件操作示例
Apr 25 Javascript
VUE组件中的 Drawer 抽屉实现代码
Aug 06 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
PHP Directory 函数的详解
2013/03/07 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
PHP目录操作实例总结
2016/09/27 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
window.open不被拦截的实现代码
2012/08/22 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
js post提交调用方法
2014/02/12 Javascript
JS烟花背景效果实现方法
2015/03/03 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
python程序 创建多线程过程详解
2019/09/23 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
标准离婚协议书范文下载
2014/11/30 职场文书
罚款通知怎么写
2015/04/22 职场文书
离婚民事起诉状
2015/08/03 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python