写一个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 left,right,mid函数
Jun 10 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
Jul 25 Javascript
javascript 特性检测并非浏览器检测
Jan 15 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
May 08 Javascript
Jquery:ajax实现翻页无刷新功能代码
Aug 05 Javascript
Js+Jq获取URL参数的集中方法示例代码
May 20 Javascript
jquery选择器需要注意的问题
Nov 26 Javascript
javascript实现base64 md5 sha1 密码加密
Sep 09 Javascript
详解JavaScript的变量和数据类型
Nov 27 Javascript
JQuery之proxy实现绑定代理方法
Aug 01 Javascript
Bootstrap按钮组实例详解
Jul 03 Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 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
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
JS 文件大小判断的实现代码
2010/04/07 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
js中有关IE版本检测
2012/01/04 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
浅析javascript的return语句
2015/12/15 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
python如何生成网页验证码
2018/07/28 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
python通过链接抓取网站详解
2019/11/20 Python
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
行政办公员自我评价分享
2013/12/14 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
金陵十三钗观后感
2015/06/04 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
详解运行Python的神器Jupyter Notebook
2021/06/03 Python