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效率个人经验谈(8-15更新),加入range技巧
Jan 09 Javascript
js实现运行代码需要刷新的解决方法
Aug 18 Javascript
浅谈Javascript事件模拟
Jun 27 Javascript
红米手机抢购的js代码
Mar 10 Javascript
jqGrid读取选择的多行的某个属性代码
May 18 Javascript
JavaScript严格模式禁用With语句的原因
Oct 20 Javascript
基于vue实现swipe分页组件实例
May 25 Javascript
JS实现上传图片的三种方法并实现预览图片功能
Jul 14 Javascript
微信小程序实现导航栏选项卡效果
Jun 19 Javascript
vue中动态设置meta标签和title标签的方法
Jul 11 Javascript
Vue实现按钮旋转和移动位置的实例代码
Aug 09 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
php时区转换转换函数
2014/01/07 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
js一组验证函数
2008/12/20 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
基于Python的身份证号码自动生成程序
2014/08/15 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
python数字类型math库原理解析
2020/03/02 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
C语言编程题
2015/03/09 面试题
一些.net面试题
2014/10/06 面试题
护理专业自荐信
2013/12/03 职场文书
申论倡议书范文
2014/05/13 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
毕业班工作总结
2015/08/10 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
tree shaking对打包体积优化及作用
2022/07/07 Java/Android