vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法


Posted in Javascript onJanuary 25, 2018

解决vue-router嵌套路由(子路由)在history模式下刷新无法渲染页面的问题,具体内容如下

一. 异常描述

本来使用的是vue-router的hash模式,但是hash模式下url需要带“#”符号,不仅看起来不舒服,而且有些场景下是会破坏路由中的"#"(微信分享页面就会把"#"后边的内容处理掉),所以就需要使用history模式,然后就让后端改下nginx配置:

location / { try_files $uri $uri/ /index.html; }

vue-router使用history模式+使用嵌套路由:

const router = new Router({
 mode: 'history',
 routes: [
  {
   path: '/',
   component: mall,
   name: 'mall'
  },
  ……

  //我的银行卡
  {
   path: '/myCard',
   meta: { requireAuth: true },
   component: myCard,
   name: 'myCard',
   children:[
   { path:'', component: card},
   { path:'add', component: add}
   ]
  }
   ……
 ]
})

访问路由和嵌套路由页面,显示正常,但是刷新页面的时候,嵌套路由页面就出异常了:

vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法

页面样式全乱了,看下页面请求加载的静态文件,所有静态文件都是404;

vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法

二. 异常解析

1. 看下官方文档对嵌套路由的说明:

vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法

2. 再看之前的异常页面,看来我们的父路由成了根目录了看下文件路径了:

vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法

3. 看下我们引入这些异常文件,是在index.html文件中直接引用的,也就是在根路径下引入的。之前的hash模式下,根路径是不会变的,所以我们在index.html文件中直接引入这些静态文件,是可行的,但是使用history模式后,根路径就不固定了。那么这种引入方式就不可行了,所以才造成了上边出现的页面无法渲染的问题:

vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法

三. 解决问题

这里有点尴尬,先考虑的主Vue中以Import的方式引入静态样式文件,的确可行,但是最后发现,直接修改index.html文件中的静态文件引入路径就OK了:

修改前:

<script src="./static/js/stomp.js"></script>

修改后

<script src="/static/js/stomp.js"></script>

四. 原理

./ 是指用户所在的当前目录(相对路径);

/ 是指根目录(绝对路径,项目根目录),也就是项目根目录;

对于hash模式,根路径是固定的,就是项目的根目录,但是history模式下,以/开头的嵌套路径会被当作根路径,所以使用“./”引入文件,就会找不到文件了,因为文件本身就是在项目根目录下的,并不在嵌套路径这个目录下。

总结,无论hash模式还是history模式,可以直接使用“/”从项目根目录引入静态文件。

PS:之前一段时间就遇到过这个问题,百度了好久,发现很少有人问这个问题,有一个也没人回答。也问了好些前端大神,还是没能解决这个问题。也许是平时写惯了“./” 和“../”这些开头的路径了吧,并没有注意到静态文件引入方式的问题,折腾了好些方法,最后很尴尬的发现,其实问题很简单,只是对框架的底层了解不透彻罢了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery UI Datepicker length为空或不是对象错误的解决方法
Dec 19 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
Aug 28 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
JavaScript仿静态分页实现方法
Aug 04 Javascript
AngularJS实现Model缓存的方式
Feb 03 Javascript
React教程之封装一个Portal可复用组件的方法
Jan 02 Javascript
angular多语言配置详解
May 16 Javascript
js实现页面多个日期时间倒计时效果
Jun 20 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 05 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 Javascript
js重写alert事件(避免alert弹框标题出现网址)
Dec 04 Javascript
vue通过路由实现页面刷新的方法
Jan 25 #Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
Jan 25 #jQuery
JavaScript实现职责链模式概述
Jan 25 #Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
Jan 25 #jQuery
解决Jquery下拉框数据动态获取的问题
Jan 25 #jQuery
vue引入新版 vue-awesome-swiper插件填坑问题
Jan 25 #Javascript
vue better-scroll插件使用详解
Jan 25 #Javascript
You might like
jQuery 源码分析笔记
2011/05/25 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
Python贪心算法实例小结
2018/04/22 Python
对Python 内建函数和保留字详解
2018/10/15 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
专科毕业生自我鉴定
2013/12/01 职场文书
会计人员岗位职责
2015/02/03 职场文书
音乐教师个人总结
2015/02/06 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
医院志愿者活动总结
2015/05/06 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
如何写新闻稿
2015/07/18 职场文书
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL
java实现web实时消息推送的七种方案
2022/07/23 Java/Android