写一个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 表单验证扩展代码(二)
Oct 20 Javascript
5秒后跳转到另一个页面的js代码
Oct 12 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
Apr 02 Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 Javascript
详解JavaScript中this关键字的用法
May 26 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 Javascript
浅谈jQuery中事情的动态绑定
Feb 12 Javascript
jquery replace方法去空格
May 08 jQuery
详解http访问解析流程原理
Oct 18 Javascript
JavaScript中的高级函数
Jan 04 Javascript
详解JavaScript中的坐标和距离
May 27 Javascript
echarts实现折线图的拖拽效果
Dec 19 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
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
Python生成随机数组的方法小结
2017/04/15 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
对python判断是否回文数的实例详解
2019/02/08 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
C语言面试题
2015/10/30 面试题
妇科医生自荐信
2013/11/05 职场文书
青年文明号事迹材料
2014/01/18 职场文书
创意广告词
2014/03/17 职场文书
南京市纪委监察局整改方案
2014/09/16 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
具结保证书范本
2015/05/11 职场文书
刮痧观后感
2015/06/05 职场文书
企业财务管理制度范本
2015/08/04 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
常用的Python代码调试工具总结
2021/06/23 Python