详解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 相关文章推荐
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
js jquery数组介绍
Jul 15 Javascript
js 有框架页面跳转(target)三种情况下的应用
Apr 09 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
Jan 27 Javascript
JS简单循环遍历json数组的方法
Apr 22 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 Javascript
vue.js实现简单轮播图效果
Oct 10 Javascript
js定时器+简单的动画效果实例
Nov 10 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
angular2中Http请求原理与用法详解
Jan 11 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
Mar 07 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
Feb 27 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 时间转换Unix时间戳代码
2010/01/22 PHP
PHP中数组的三种排序方法分享
2012/05/07 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
python梯度下降算法的实现
2020/02/24 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
浙江文明网签名寄语
2014/01/18 职场文书
护士在校生自荐信
2014/02/01 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript