Vue-Router实现页面正在加载特效方法示例


Posted in Javascript onFebruary 12, 2017

前言

vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。

如果你在使用 Vue.js 和 Vue-Router 开发单页面应用。因为每个页面都是一个 Vue 组件,你需要从服务器端请求数据,然后再让 Vue 引擎来渲染到页面上。

例如,这里有个用户个人资料的页面。

user.vue 文件如下:

<template>
 <div>
  <h2 v-text="user.name"></h2>
  <p v-text="user.description"></p>
 </div>
</template>
<script>
 export default{
  data(){
   return{
    user: {}
   }
  }
 }
</script>

在动画过渡期间向服务器请求数据,如下:

<script>
export default{
 data(){
  return{
   user: {}
  }
 },
 route: {
  data: function (transition) {
   this.getUserDetails(transition);
  }
 },
 methods: {
  getUserDetails(transition)
  {
   this.$http.get('/users/' + this.$route.params.userName)
    .then(function (response) {
     this.user = response.data;
     transition.next();
    });
  }
 }
}
</script>

这样,我们可以通过访问变量 $loadingRouteData。就可以实现隐藏所有的页面元素,显示某个正在加载的元素,比如某个 logo 等。

<div v-if="$loadingRouteData">
 <div class="white-widget grey-bg author-area">
 <div class="auth-info row">
 <div class="timeline-wrapper">
 <div class="timeline-item">
  <div class="animated-background">
   <div class="background-masker header-top"></div>
   <div class="background-masker header-left"></div>
   <div class="background-masker header-right"></div>
   <div class="background-masker header-bottom"></div>
   <div class="background-masker subheader-left"></div>
   <div class="background-masker subheader-right"></div>
   <div class="background-masker subheader-bottom"></div>
  </div>
 </div>
 </div>
 </div>
 </div>
</div>
<div v-if="!$loadingRouteData">
 <div>
  <h2 v-text="user.name"></h2>
  <p v-text="user.description"></p>
 </div>
</div>

比如,正在加载的样式代码如下:

.timeline-item {
 background: #fff;
 border-bottom: 1px solid #f2f2f2;
 padding: 25px;
 margin: 0 auto;
}

@keyframes placeHolderShimmer{
 0%{
 background-position: -468px 0
 }
 100%{
 background-position: 468px 0
 }
}

.animated-background {
 animation-duration: 1s;
 animation-fill-mode: forwards;
 animation-iteration-count: infinite;
 animation-name: placeHolderShimmer;
 animation-timing-function: linear;
 background: #f6f7f8;
 background: linear-gradient(to right, #eeeeee 8%, #dddddd 18%, #eeeeee 33%);
 background-size: 800px 104px;
 height: 40px;
 position: relative;
}

.background-masker {
 background: #fff;
 position: absolute;
}

/* Every thing below this is just positioning */

.background-masker.header-top,
.background-masker.header-bottom,
.background-masker.subheader-bottom {
 top: 0;
 left: 40px;
 right: 0;
 height: 10px;
}

.background-masker.header-left,
.background-masker.subheader-left,
.background-masker.header-right,
.background-masker.subheader-right {
 top: 10px;
 left: 40px;
 height: 8px;
 width: 10px;
}

.background-masker.header-bottom {
 top: 18px;
 height: 6px;
}

.background-masker.subheader-left,
.background-masker.subheader-right {
 top: 24px;
 height: 6px;
}


.background-masker.header-right,
.background-masker.subheader-right {
 width: auto;
 left: 300px;
 right: 0;
}

.background-masker.subheader-right {
 left: 230px;
}

.background-masker.subheader-bottom {
 top: 30px;
 height: 10px;
}

.background-masker.content-top,
.background-masker.content-second-line,
.background-masker.content-third-line,
.background-masker.content-second-end,
.background-masker.content-third-end,
.background-masker.content-first-end {
 top: 40px;
 left: 0;
 right: 0;
 height: 6px;
}

.background-masker.content-top {
 height:20px;
}

.background-masker.content-first-end,
.background-masker.content-second-end,
.background-masker.content-third-end{
 width: auto;
 left: 380px;
 right: 0;
 top: 60px;
 height: 8px;
}

.background-masker.content-second-line {
 top: 68px;
}

.background-masker.content-second-end {
 left: 420px;
 top: 74px;
}

.background-masker.content-third-line {
 top: 82px;
}

.background-masker.content-third-end {
 left: 300px;
 top: 88px;
}

这样,你就有了 Vue-Router 的正在加载时候的效果了。你可以把以上代码写进到一个单独的组件内,在你用的地方引用它就行。

最后

这仅是个关于 Vue-Router 加载的组件的简单教程,实际上可以在许多地方来进行改进,

VueJobs.com

如果你是一位对 Vue.js 感兴趣的前端工程师,可去这个网上浏览下,了解下国外对 Vue 开发者的要求。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
初学js 新节点的创建 删除 的步骤
Jul 04 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
Apr 27 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
Oct 10 Javascript
Javascript实现单例模式
Jan 24 Javascript
谈一谈js中的执行环境及作用域
Mar 30 Javascript
概述jQuery的元素筛选
Nov 23 Javascript
js实现产品缩略图效果
Mar 10 Javascript
JavaScript手风琴页面制作
May 17 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
Jan 15 Javascript
Vue实现base64编码图片间的切换功能
Dec 04 Javascript
js实现html滑动图片拼图验证
Jun 24 Javascript
javascript实现点击按钮切换轮播图功能
Sep 23 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
Feb 11 #Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
Feb 11 #Javascript
JavaScript实现瀑布流以及加载效果
Feb 11 #Javascript
JavaScript表单验证的两种实现方法
Feb 11 #Javascript
jQuery实现复制到粘贴板功能
Feb 11 #Javascript
js实现PC端和移动端刮卡效果
Mar 27 #Javascript
js实现短信发送倒计时功能(正则验证)
Feb 10 #Javascript
You might like
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
脚本收藏iframe
2006/07/21 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
python学习之编写查询ip程序
2016/02/27 Python
python中列表和元组的区别
2017/12/18 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
python爬虫添加请求头代码实例
2019/12/28 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
汽车装潢店创业计划书范文
2014/02/05 职场文书
青年文明号服务承诺
2014/03/31 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
导游词之临安白水涧
2019/11/05 职场文书
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js