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 相关文章推荐
实现连缀调用的map方法(prototype)
Aug 05 Javascript
12个非常有创意的JavaScript小游戏
Mar 18 Javascript
『jQuery』名称冲突使用noConflict方法解决
Apr 22 Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 Javascript
JS碰撞运动实现方法详解
Dec 15 Javascript
JS实现全屏的四种写法
Dec 30 Javascript
微信小程序 特效菜单抽屉效果实例代码
Jan 11 Javascript
vue实现百度搜索下拉提示功能实例
Jun 14 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
Aug 08 Javascript
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
JavaScript惰性载入函数实例分析
Mar 27 Javascript
element-ui上传一张图片后隐藏上传按钮功能
May 22 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操作mysql数据库分表的方法
2016/06/09 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
深入解析Python中的WSGI接口
2015/05/11 Python
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
python http接口自动化脚本详解
2018/01/02 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
python statsmodel的使用
2020/12/21 Python
PHP中如何使用Cookie
2015/10/28 面试题
一些Unix笔试题和面试题
2012/09/25 面试题
介绍一下Make? 为什么使用make
2016/07/31 面试题
本科生职业生涯规划书范文
2014/01/21 职场文书
消防安全管理制度
2014/02/01 职场文书
财务简历的自我评价
2014/03/05 职场文书
益达广告词
2014/03/14 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL