详解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 相关文章推荐
js控制框架刷新
Aug 01 Javascript
js中判断控件是否存在
Aug 25 Javascript
JavaScript组件开发完整示例
Dec 15 Javascript
基于Javascript实现弹出页面效果
Jan 01 Javascript
JavaScript判断变量是否为数组的方法(Array)
Feb 24 Javascript
将form表单通过ajax实现无刷新提交的简单实例
Oct 12 Javascript
详解Python中logging日志模块在多进程环境下的使用
Dec 26 Javascript
实例详解display:none与visible:hidden的区别
Mar 30 Javascript
微信小程序 蓝牙的实现实例代码
Jun 27 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
Jul 31 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
vuejs简单验证码功能完整示例
Jan 08 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
php基础学习之变量的使用
2011/06/09 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
php判断访问IP的方法
2015/06/19 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
2015/05/16 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
python模块导入的细节详解
2018/12/10 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
高中毕业的自我鉴定
2013/12/09 职场文书
入党自荐书范文
2014/03/09 职场文书
财务管理专业自荐书
2014/09/02 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
mysql查询结果实现多列拼接查询
2022/04/03 MySQL
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫