写一个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 定义初始化数组函数
Sep 07 Javascript
XENON基于JSON变种
Jul 27 Javascript
基于jsTree的无限级树JSON数据的转换代码
Jul 27 Javascript
javascript函数作用域学习示例(js作用域)
Jan 13 Javascript
AngularJS基础知识
Dec 21 Javascript
初步认识JavaScript函数库jQuery
Jun 18 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
Sep 02 Javascript
angularjs实现分页和搜索功能
Jan 03 Javascript
Vue通过ref父子组件拿值方法
Sep 12 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
Jul 10 Javascript
Emberjs 通过 axios 下载文件的方法
Sep 03 Javascript
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
解决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实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
通过实例解析js可枚举属性与不可枚举属性
2020/12/02 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
跟老齐学Python之??碌某?? target=
2014/09/12 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
J2EE中的容器都包括哪些
2013/08/21 面试题
企事业单位求职者的自我评价
2013/12/28 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
法人授权委托书范本
2014/09/17 职场文书
学术会议邀请函
2015/01/30 职场文书
经费申请报告
2015/05/15 职场文书
毕业证明书
2015/06/19 职场文书
六五普法学习心得体会
2016/01/21 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python