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 相关文章推荐
有关于eclipse配置spket需要注意的一些地方
Apr 07 Javascript
jQuery中element选择器用法实例
Dec 29 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
Feb 16 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
Jun 21 Javascript
jQuery Ajax请求后台数据并在前台接收
Dec 10 Javascript
Vue创建头部组件示例代码详解
Oct 23 Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 Javascript
浅谈Node 异步IO和事件循环
May 05 Javascript
javascript实现自由编辑图片代码详解
Jun 21 Javascript
js实现多张图片每隔一秒切换一张图片
Jul 29 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
May 20 Javascript
详解 javascript对象创建模式
Oct 30 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实现javascript的escape和unescape函数
2013/06/29 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
Python写的Socks5协议代理服务器
2014/08/06 Python
Django URL传递参数的方法总结
2016/08/28 Python
详解python进行mp3格式判断
2016/12/23 Python
Flask框架配置与调试操作示例
2018/07/23 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
对Python 检查文件名是否规范的实例详解
2019/06/10 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
巴西在线鞋店:Shoestock
2017/10/28 全球购物
美国在线工具商店:Acme Tools
2018/06/26 全球购物
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
高效课堂标语
2014/06/26 职场文书
董存瑞观后感
2015/06/11 职场文书
公司行政管理制度范本
2015/08/05 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS