前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何写一个vue插件

如何写一个vue插件

作者头像
yangdongnan
发布2019-03-28 15:45:00
6600
发布2019-03-28 15:45:00
举报
文章被收录于专栏:日常记录
前文

  • 一个加载进度条插件
  • 在切换页面时在浏览器顶部呈现一个进度条
目录结构
在这里插入图片描述
在这里插入图片描述
.vue文件
代码语言:javascript
复制
<template>
	<div class="uic-loader-fixed" :style="{height:height}">
		<span class="uic-steps" :style="{backgroundColor:bgColor}"></span>
	</div>
</template>
<script>
	/*
	 * props
	 * 	@params bgColor 控制加载状态条背景色
	 * 	@params height 控制加载状态条高度
	 * methods
	 * 	@params init  存储元素
	 * 	@params start 开始加载 -> 无完成时最大80%
	 * 	@params finish 完成 -> 100% 300ms后消失
	 * 使用
	 *  main.js中 import 或 require 引入 loader/index.js 文件
	 *  使用Vue.use 注册插件
	 * 示例
	 *  Vue.use(loader, option = {} )  //option 为参数
	 * * * *
	 *  import loader from './plugin/loader/index'
	 *  Vue.use(loader,{height:'3px',backgroundColor:'red'})
	 * */
  export default {
    methods : {
      init () {
        clearInterval(this.steps);
        this.span = document.querySelector('.uic-steps');
        this.span.style.transform = `translate3d(${-100}%,0,0)`;
        this.$el.style.opacity = '1';
      },
      start () {
        this.init();
        let that = this;
        this.step = 1;
        this.$el.style.zIndex = this.zIndex++
        that.steps = setInterval(() => {
          if ( this.step == 80 ) {
            clearInterval(that.steps);
          }
          this.step++;
          that.span.style.transform = `translate3d(${-100 + this.step}%,0,0)`;
        }, 100)
      },
      finish () {
        if(this.step === 0){
          this.init();
        }

        let that = this;
        clearInterval(that.steps)
        that.span.style.transform = `translate3d(${-(100 - this.step) + (100 - this.step)}%,0,0)`;
        let finishTimeout = setTimeout(() => {
          that.span.style.transform = `translate3d(${100}%,-3px,0)`;
          that.$el.style.opacity = '0';
          that.$el.style.transition = 'transform .4s ease-out 0s,opacity .4s ease-out .1s';
          clearTimeout(finishTimeout);
          this.zIndex = 2000;
          this.step = 0
        }, 300)
      }
    },
    props : {
      'bg-color' : String,
      'height' : String
    },
    data () {
      return {
        loader : '',
        span : '',
        step : 0, //步进器
        steps : '',
        zIndex: 2000
      }
    },
    name : "UicLoader"
  }
</script>
<!--
<style scoped lang="less">
	.uic-loader-fixed {
		position: fixed;
		left: 0;
		top: 0;
		width: 100%;
		height: 3px;
		overflow: hidden;
		.uic-steps {
			display: block;
			width: 100%;
			height: 100%;
			background-color: #297dff;
			-webkit-transform: translate3d(-100%, 0, 0);
			transform: translate3d(-100%, 0, 0);
		}
	}
</style>-->

  • 正常情况我们引入这个.vue组件就可以用了,但是这是组件 如何变成插件呢?
  • 就想要通过 vue.use使用或是 this.$loader使用 怎么办?
loader.js
代码语言:javascript
复制
import Vue from 'vue'
import UICLoader from './loader.vue'
const LoaderConstructor = Vue.extend(UICLoader);

let getInstance = () =>{
  return new LoaderConstructor({
    el:document.createElement('div')
  })
}

const Loader = (options = {}) =>{
  let instance = getInstance();
  instance.height = options.height || '3px';
  instance.bgColor = options.backgroundColor || '#297dff';
  document.body.appendChild(instance.$el)
  const {init,start,finish} = instance;
  
  Vue.nextTick(function () {
    // init()  // ...实例化dom初始化
  })
  
  return {
    start,
    finish
  }
}

export default Loader;

  • 引入vue实力, Vue.extend() 使用vue的构造器继承vue 创建一个元素 就是vue一个组件实例中的$el 这个时候我们就得到了loader组件实例中的数据
  • 暴露出可以执行的方法 处理传入参数 最后把整体插件暴露出去
index.js
代码语言:javascript
复制
export { default } from './src/loader';

main.js 使用

代码语言:javascript
复制
 import UICLoader from './loader'
 Vue.prototype.$loader = UICLoader({ height : '2px'}); 
github地址

https://github.com/nan1010082085/uic-vue/tree/master/src/views/loader

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年12月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前文
  • 目录结构
    • .vue文件
      • loader.js
        • index.js
          • github地址
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档