详解Vue路由History mode模式中页面无法渲染的原因及解决


Posted in Javascript onSeptember 28, 2017

Vue下路由History mode导致页面无法渲染的原因

用 Vue.js + vue-router 创建单页应用,是非常简单的。使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们。

一般开发的单页应用的URL都会带有#号的hash模式,因为整个应用本身而言就只有一个HTML,其他的都是通过router来渲染。如果因为业务需要,或者单纯是觉得带#号不美观,那么可以使用history模式,简单而言就是在router的配置文件index.js中添加如下一行代码:

history: mode

没错,这样URL不再会有#号,你会发现整个地址栏回到了你熟悉的那个样子,不过,接下来介绍的就非常的重要了,可能很多刚入门的新人或多或少都会遇见这么一两个坑…

页面无法渲染

这里以我写的一个项目为例子,当我开启history模式的时候,我并没有对路由进行任何处理,在Dev阶段一切都是正常的,可是打包之后,访问项目路径:

sdp.driver.com/driver/

会发现页面一片空白,但是静态文件都能够正常的引用,因为使用了YII中的模块,所以除了域名之外,还会带有driver模块名。一般很多人创建的项目都放在了根目录下面,也就是:

sdp.driver.com

这样的一种形式,没问题。可是如果配置了模块,或者放置在了子文件夹下面,那么就会出问题。其实,这是因为router无法找到路径中的组件,所以也就无法渲染了。只需要修改router中的index.js,在每个path中加上你项目名称就行了,这样就能够成功了。

详解Vue路由History mode模式中页面无法渲染的原因及解决

最后的页面效果:

详解Vue路由History mode模式中页面无法渲染的原因及解决

404错误

在History mode下,如果直接通过地址栏访问路径,那么会出现404错误,这是因为这是单页应用(废话)…其实是因为调用了history.pushState API 所以所有的跳转之类的操作都是通过router来实现的,解决这个问题很简单,只需要在后台配置如果URL匹配不到任何静态资源,就跳转到默认的index.html。具体配置如下:

Apache

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteRule ^index\.html$ - [L]
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule . /index.html [L]
</IfModule>

nginx

location / {
 try_files $uri $uri/ /index.html;
}

Node.js (Express)

关于每次点击链接都要刷新页面的问题

众所周知,开发单页应用就是因为那丝般顺滑的体验效果,如果每次点击都会刷新页面…

出现这个的原因是因为使用了window.location来跳转,只需要使用使用router提供的方法,就能够解决这个问题:

在main.js中配置中将router绑定到全局

Vue.prototype.router = router;

之后都使用如下的方式来控制跳转

this.router.push('driver/service');

好啦,这次关于Vue路由的“坑”就介绍到这里了,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript针对DOM的应用分析(三)
Apr 15 Javascript
js对象内部访问this修饰的成员函数示例
Apr 27 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
node.js中的fs.appendFile方法使用说明
Dec 17 Javascript
jQuery css() 方法动态修改CSS属性
Sep 25 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
Dec 28 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
Mar 21 jQuery
vue js秒转天数小时分钟秒的实例代码
Aug 08 Javascript
JS中数组与对象的遍历方法实例小结
Aug 14 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
Jan 08 Javascript
原生JavaScript实现留言板
Jan 10 Javascript
js作用域及作用域链工作引擎
Jul 07 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 #Javascript
详解基于vue-router的动态权限控制实现方案
Sep 28 #Javascript
node.js学习之断言assert的使用示例
Sep 28 #Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
Sep 28 #Javascript
node.js学习之事件模块Events的使用示例
Sep 28 #Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 #Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
Sep 28 #Javascript
You might like
让你的网站首页自动选择语言转跳
2006/12/06 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
destoon整合UCenter图文教程
2014/06/21 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
vue2.x select2 指令封装详解
2017/10/12 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
vue实现文字加密功能
2019/09/27 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
Python实现多行注释的另类方法
2014/08/22 Python
Python递归函数实例讲解
2019/02/27 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
init进程的作用
2015/08/20 面试题
remote接口和home接口主要作用
2013/05/15 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
求职简历推荐信范文
2013/12/02 职场文书
复核员上岗演讲稿
2014/01/05 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书