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 相关文章推荐
js判断60秒以及倒计时示例代码
Jan 24 Javascript
如何防止回车(enter)键提交表单
May 11 Javascript
js+jquery实现图片裁剪功能
Jan 02 Javascript
js中利用cookie实现记住密码功能
Aug 20 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
Dec 14 Javascript
vue打包后显示空白正确处理方法
Nov 01 Javascript
实现jquery放大镜的两种方法
Feb 22 jQuery
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
js简单遍历获取对象中的属性值的方法示例
Jun 19 Javascript
微信小程序制作扭蛋机代码实例
Sep 24 Javascript
vue实现标签云效果的示例
Nov 09 Javascript
用JS实现飞机大战小游戏
Jun 09 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
PHP 在线翻译函数代码
2009/05/07 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
为什么python比较流行
2020/06/19 Python
详解python中的异常和文件读写
2021/01/03 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
EJB的几种类型
2012/08/15 面试题
应届生煤化工求职信
2013/10/21 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
党员政治学习材料
2014/05/14 职场文书
给领导的感谢信范文
2015/01/23 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
通知怎么写?
2019/04/17 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
MySQL里面的子查询的基本使用
2021/08/02 MySQL