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 相关文章推荐
Ubuntu 11.10 安装Node.js的方法
Nov 30 Javascript
window resize和scroll事件的基本优化思路
Apr 29 Javascript
Node.js中对通用模块的封装方法
Jun 06 Javascript
SWFObject基本用法实例分析
Jul 20 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
Jul 27 Javascript
关于function类中定义变量this的简单说明
May 28 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
RequireJS用法简单示例
Aug 20 Javascript
vue-router beforeEach跳转路由验证用户登录状态
Dec 26 Javascript
JSON的parse()方法介绍
Jan 31 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
mock.js模拟前后台交互
Jul 25 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数据库密码的找回的步骤
2011/01/12 PHP
php 中的closure用法详解
2017/06/12 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
如何用python整理附件
2018/05/13 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
python障碍式期权定价公式
2019/07/19 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
Python partial函数原理及用法解析
2019/12/11 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
EJB的激活机制
2013/10/25 面试题
工业学校毕业生自荐信范文
2014/01/03 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
简单的项目建议书模板
2014/03/12 职场文书
优秀教师个人总结
2015/02/11 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
煤矿隐患排查制度
2015/08/05 职场文书