写一个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 相关文章推荐
取得传值的函数
Oct 27 Javascript
jQuery 使用手册(七)
Sep 23 Javascript
JSON+HTML实现国家省市联动选择效果
May 18 Javascript
jquery attr方法获取input的checked属性问题
May 26 Javascript
JavaScript 表单处理实现代码
Apr 13 Javascript
基于jQuery实现搜索关键字自动匹配功能
Mar 26 Javascript
WEB前端实现裁剪上传图片功能
Oct 17 Javascript
简单实现Bootstrap标签页
Aug 09 Javascript
jQuery:unbind方法的使用详解
Aug 14 jQuery
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
Oct 08 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
vue 路由守卫(导航守卫)及其具体使用
Feb 25 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 fsockopen写的HTTP下载的类
2007/02/22 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
理解Koa2中的async&amp;await的用法
2018/02/05 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
python获取豆瓣电影简介代码分享
2014/01/16 Python
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
详解Python locals()的陷阱
2019/03/26 Python
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
经典c++面试题四
2015/05/14 面试题
应届生保险求职信
2013/11/11 职场文书
机械专业求职信
2014/05/25 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
八年级历史教学反思
2016/02/19 职场文书
实用求职信模板范文
2019/05/13 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis