详解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 相关文章推荐
前后台交互过程中json格式如何解析以及如何生成
Dec 26 Javascript
文件编码导致jquery失效的解决方法
Jun 26 Javascript
深入理解Javascript作用域与变量提升
Dec 09 Javascript
javascript实现简单的Map示例介绍
Dec 23 Javascript
JS中如何实现复选框全选功能
Dec 19 Javascript
常用的 JS 排序算法 整理版
Apr 05 Javascript
详解vue文件中使用echarts.js的两种方式
Oct 18 Javascript
Vue项目自动转换 px 为 rem的实现方法
Oct 29 Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 Javascript
Vue实现商品详情页的评价列表功能
Sep 04 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
Sep 14 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
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 array的学习笔记
2012/05/10 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
假日旅行社实习自我鉴定
2013/09/24 职场文书
学年自我鉴定范文
2013/10/01 职场文书
行政助理求职自荐信
2013/10/26 职场文书
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
难忘的一课教学反思
2014/04/30 职场文书
白血病募捐倡议书
2014/05/14 职场文书
作风建设演讲稿
2014/05/23 职场文书
爱护公共设施的标语
2014/06/24 职场文书
班级体育活动总结
2014/07/05 职场文书
农行心得体会
2014/09/02 职场文书
给医院的感谢信
2015/01/21 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
消费者投诉书范文
2015/07/02 职场文书