写一个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 相关文章推荐
IE和Firefox下javascript的兼容写法小结
Dec 10 Javascript
解释&amp;&amp;和||在javascript中的另类用法
Jul 28 Javascript
HTML5实现留言和回复页面样式
Jul 22 Javascript
谈谈对offsetleft兼容性的理解
Nov 11 Javascript
JavaScript基础语法之js表达式
Jun 07 Javascript
AngularJS入门教程之Scope(作用域)
Jul 27 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 Javascript
微信小程序显示倒计时功能示例【测试可用】
Dec 03 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
May 10 Javascript
vue 解除鼠标的监听事件的方法
Nov 13 Javascript
vue中keep-alive,include的缓存问题
Nov 26 Javascript
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
解决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
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
基于jquery的tab切换 js原理
2010/04/01 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
webpack入门必知必会
2017/01/16 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
通过angular CDK实现页面元素拖放的步骤详解
2020/07/01 Javascript
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
bpython 功能强大的Python shell
2016/02/16 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
电气自动化大学生求职信
2013/10/16 职场文书
大学自主招生自荐信
2013/12/16 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
创先争优个人总结
2015/03/04 职场文书
2015年预算员工作总结
2015/05/14 职场文书
人事任命书范本
2015/09/21 职场文书