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 相关文章推荐
IE与firefox之jquery用法区别
Oct 03 Javascript
js中设置元素class的三种方法小结
Aug 28 Javascript
js使用正则实现ReplaceAll全部替换的方法
Jul 18 Javascript
jQuery中parentsUntil()方法用法实例
Jan 07 Javascript
js实现顶部可折叠的菜单工具栏效果实例
May 09 Javascript
用原生js统计文本行数的简单示例
Aug 19 Javascript
AngularJS ng-style中使用filter
Sep 21 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
Sep 24 Javascript
浅析bootstrap原理及优缺点
Mar 19 Javascript
Vue实现百度下拉提示搜索功能
Jun 21 Javascript
使用canvas进行图像编辑的实例
Aug 29 Javascript
浅谈Three.js截图并下载的大坑
Nov 01 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结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
Prototype Array对象 学习
2009/07/19 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
教师自荐信范文
2013/12/09 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
解除劳动合同协议书
2014/04/14 职场文书
体育馆的标语
2014/06/24 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
六年级小学生评语
2014/12/26 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android