写一个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 相关文章推荐
Javascript 复制数组实现代码
Nov 26 Javascript
jquery radio 操作代码
Mar 16 Javascript
JQuery中html()方法使用不当带来的陷阱
Apr 07 Javascript
js取得html iframe中的元素和变量值
Jun 30 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
Dec 28 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
Nov 04 Javascript
轻松掌握JavaScript策略模式
Aug 25 Javascript
详解RequireJS按需加载样式文件
Apr 12 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
JS实现二维数组元素的排列组合运算简单示例
Jan 28 Javascript
vue使用map代替Aarry数组循环遍历的方法
Apr 30 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设计模式之单例模式使用示例
2014/01/20 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
php实现评论回复删除功能
2017/05/23 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
利用Python如何生成便签图片详解
2018/07/09 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python 内置函数汇总详解
2019/09/16 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
python几种常用功能实现代码实例
2019/12/25 Python
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
学期自我鉴定范文
2013/10/01 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
求职自我评价范文100字
2014/09/23 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
庆祝教师节主持词
2015/07/06 职场文书
高中运动会广播稿
2015/08/19 职场文书