详解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 相关文章推荐
ExtJS GridPanel 根据条件改变字体颜色
Mar 08 Javascript
js实现单一html页面两套css切换代码
Apr 11 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
Aug 05 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
Jun 05 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
Jun 06 Javascript
jQuery回调函数的定义及用法实例
Dec 23 Javascript
JavaScript 数组的深度复制解析
Nov 02 Javascript
angularJS模态框$modal实例代码
May 27 Javascript
Angular5中状态管理的实现
Sep 03 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 Javascript
解决VueCil代理本地proxytable无效报错404的问题
Nov 07 Javascript
Ajax常用封装库——Axios的使用
May 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 JSON格式数据交互实例代码详解
2011/01/13 PHP
PHP抽象类 介绍
2012/06/13 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
JavaScript中的this机制
2016/01/30 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
市场营销专业毕业生求职信
2014/03/26 职场文书
青安岗事迹材料
2014/05/14 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript
代码复现python目标检测yolo3详解预测
2022/05/06 Python