写一个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 相关文章推荐
js获取下拉列表的值和元素个数示例
May 07 Javascript
js实现漂浮回顶部按钮实例
May 06 Javascript
jQuery Validate验证框架经典大全
Sep 23 Javascript
JS中Eval解析JSON字符串的一个小问题
Feb 21 Javascript
Bootstrap插件全集
Jul 18 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
Dec 29 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
Jan 17 Javascript
JavaScript运动框架 多物体任意值运动(三)
May 17 Javascript
javascript 数据存储的常用函数总结
Jun 01 Javascript
bootstrap datetimepicker控件位置异常的解决方法
Nov 23 Javascript
JS实现瀑布流效果
Mar 07 Javascript
详解ES6 中的Object.assign()的用法实例代码
Jan 11 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
PHP开发入门教程之面向对象
2006/12/05 PHP
php.ini中date.timezone设置分析
2011/07/29 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
PHP学习笔记之session
2018/05/06 PHP
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
使用Python实现简单的服务器功能
2017/08/25 Python
python flask中静态文件的管理方法
2018/03/20 Python
PyQt5 多窗口连接实例
2019/06/19 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
Python with语句用法原理详解
2020/07/03 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
军训自我鉴定
2013/12/14 职场文书
职工运动会邀请函
2014/01/19 职场文书
文明学生标兵事迹
2014/01/21 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
毕业设计论文评语
2014/12/31 职场文书
污水处理保证书
2015/05/09 职场文书
母亲节感言
2015/08/03 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书