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实现div拖拽宽度示例代码
Jul 31 Javascript
jquery鼠标滑过提示title具体实现代码
Aug 06 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
Oct 09 Javascript
js特殊字符转义介绍
Nov 05 Javascript
jQuery中Dom的基本操作小结
Jan 23 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
Aug 22 Javascript
jQuery实现炫酷的鼠标轨迹特效
Feb 01 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
Nov 24 Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 Javascript
详解axios在vue中的简单配置与使用
May 10 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
Feb 14 Javascript
javascript中toFixed()四舍五入使用方法详解
Sep 28 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
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python 多线程实现检测服务器在线情况
2015/11/25 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
java字符串格式化输出实例讲解
2021/01/06 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
日期和时间问题
2015/01/04 面试题
酒店服务与管理毕业生求职信
2013/11/02 职场文书
单身联谊活动方案
2014/01/29 职场文书
荷叶圆圆教学反思
2014/02/01 职场文书
大学生新学期计划书
2014/04/28 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
销售员岗位职责范本
2015/04/11 职场文书
小学数学国培研修日志
2015/11/13 职场文书
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js