写一个Vue loading 插件


Posted in Javascript onNovember 09, 2020

作者:imgss

出处:http://www.cnblogs.com/imgss

什么是vue插件?

  • 从功能上说,插件是为Vue添加全局功能的一种机制,比如给Vue添加一个全局组件,全局指令等;
  • 从代码结构上说,插件就是一个必须拥有install方法的对象,这个方法的接收的第一个参数是Vue构造函数,还可以接收一个可选的参数,用于配置插件:
var myplugin = {
  install:function(Vue, options){
 ...
  }
}

从意义上来说,正如jQuery的$.fn使jQuery有了一个庞大的生态一样,Vue的插件机制使Vue形成了一个生态系统,你可以开发一个插件给别人复用。

使用插件

使用一个插件,只要像下面这样:

Vue.use(myPlugin)

写一个loading插件

光说不练假把式,接下来写一个loading插件练练手,这个插件被封装成一个全局组件,实现下面的效果:

写一个Vue loading 插件

1 定义接口

我们希望应用这个插件的方式如下:

<loading text='imgss' duration='3'></loading>

其中,text用于定义loading动画显示的文字,duration定义动画时间

2 实现静态组件

新建一个loading.js文件:

let myPlugin = {
 install: function (Vue, options) {
  Vue.component('loading', {
   props: {
    text:{
     type:String
    },
    duration:{
     type:String,
     default:'1s'//默认1s
    }
   },
   data: function() {
    return {};
   },
   template: `
    <div class='wrapper'>
     <div class='loading'>
      <span style='width:20px' v-for='char in text'>{{char}}</span>
     </div>
    </div>
   `
  });

这里模板的作用在于,将输入的字符串转换成组成字符串的字符构成的span元素;
接下来,新建一个html文件:

<html>
 <head>
  <meta charset='utf-8'>
  <title>插件</title>
 </head>
 <body>
  <div id="app">
   <loading text='imgss'></loading>
   <loading text='我是一个粉刷匠' duration='2s'></loading>
  </div>
  <script src="http://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
  <script src="./loading.js"></script>
  <script>
   Vue.use(myPlugin);
   var app = new Vue({
    el: '#app',
    data: {
    }
   });
  </script>

 </body>
</html>

这时基本上可以看到一个静态效果。

3 加动画

给每个元素加上一个控制上下的animation

@keyframes move {
  0% {
   margin-top: -10px;
   border-bottom: 1px solid;
  }
  50% {
   margin-top: 10px;
   border-bottom: none;
  }
  100% {
   margin-top: -10px;
  }
 }

除此之外,还有一下其他的公有样式代码,利用mounted生命周期函数,动态生成一个style标签,将css代码插到文档中:

mounted: function () {
    var cssFlag = false;
    return function () {
     if (cssFlag) {
      return;
     }
     var head = document.querySelector('head');
     var style = document.createElement('style');
     style.type = 'text/css';
     style.innerText = `
     .wrapper{
      display: flex;
      justify-content: center;
     }
     .loading {
      display: flex;
      text-align: center;
      padding-top: 30px;
      height: 50px;
      justify-content: space-between;
     }
     .loading span {
      margin-top: 0;
      animation: ease infinite move;
      display: block;
     }

     @keyframes move {
      0% {
       margin-top: -10px;
       border-bottom: 1px solid;
      }
      50% {
       margin-top: 10px;
       border-bottom: none;
      }
      100% {
       margin-top: -10px;
      }
     }`;
     head.appendChild(style);
     cssFlag = true;
    };
   }(),

然后通过控制span的animation-delay来模拟曲线:

<span 
  :style='{
   width: "20px", 
   animationDuration: duration.indexOf("s") === -1 ? duration + "s" : duration , 
   animationDelay: parseInt(duration)/text.length*index +"s"
  }' 
  v-for='char,index in text'>
  {{char}}
 </span>

到这里,插件基本完成,看一下效果:

写一个Vue loading 插件

demo

代码

codepen

以上就是写一个Vue loading 插件的详细内容,更多关于Vue 插件的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jQuery自定义事件的简单实现代码
Jan 27 Javascript
jQuery判断一个元素是否可见的方法
Jun 05 Javascript
Javascript数组Array基础介绍
Mar 13 Javascript
BootStrap modal模态弹窗使用小结
Oct 26 Javascript
纯JS单页面赛车游戏制作代码分享
Mar 03 Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
完美解决linux下node.js全局模块找不到的情况
May 16 Javascript
iView框架问题整理小结
Oct 16 Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
Sep 21 Javascript
解决Vue大括号字符换行踩的坑
Nov 09 #Javascript
vue data有值,但是页面{{}} 取不到值的解决
Nov 09 #Javascript
vue 防止页面加载时看到花括号的解决操作
Nov 09 #Javascript
Webpack的Loader和Plugin的区别
Nov 09 #Javascript
解决vue初始化项目一直停在downloading template的问题
Nov 09 #Javascript
在VUE中使用lodash的debounce和throttle操作
Nov 09 #Javascript
解决vue init webpack 下载依赖卡住不动的问题
Nov 09 #Javascript
You might like
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
ArrayList类(增强版)
2007/04/04 Javascript
json 定义
2008/06/10 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python 数据加密代码
2008/12/24 Python
Python基于select实现的socket服务器
2016/04/13 Python
实例讲解Python爬取网页数据
2018/07/08 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
使用python求解二次规划的问题
2020/02/29 Python
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
.NET概念性的面试题
2012/02/29 面试题
string = null 和string = ''的区别
2013/04/28 面试题
儿媳婚宴答谢词
2014/01/14 职场文书
电子信息专业自荐书
2014/02/04 职场文书
婚礼主持词开场白
2014/03/13 职场文书
中国好声音广告词
2014/03/18 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
教师读书笔记
2015/06/29 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
Hive常用日期格式转换语法
2022/06/25 数据库
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript