详解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中的关键字&quot;VAR&quot;使用详解 分享
Jul 31 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
Dec 19 Javascript
jQuery中document与window以及load与ready 区别详解
Dec 29 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 Javascript
深入理解Javascript箭头函数中的this
Feb 13 Javascript
基于vuejs实现一个todolist项目
Apr 11 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
Apr 26 Javascript
删除table表格行的实例讲解
Sep 21 Javascript
vue中使用element-ui进行表单验证的实例代码
Jun 22 Javascript
JavaScript两种计时器的实例讲解
Jan 31 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
Apr 17 Javascript
Vue 列表上下过渡效果的实例代码
Jun 25 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设计模式中单例模式的应用分析
2013/05/15 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
Python中的生成器和yield详细介绍
2015/01/09 Python
python字典get()方法用法分析
2015/04/17 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
python基于phantomjs实现导入图片
2016/05/13 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
Python 线程池用法简单示例
2019/10/02 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
公司合作协议书范本
2014/04/18 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
实习评语大全
2014/04/26 职场文书
导师推荐信范文
2014/05/09 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
政协委员个人总结
2015/03/03 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
儿子满月酒致辞
2015/07/29 职场文书
感恩教师主题班会
2015/08/12 职场文书