Vue 开发自定义插件学习记录 -- 入门

首先,你需要了解插件实现的基本原理

插件基本原理:

我们都知道用Vue.use注册插件,那你知道Vue.use(plugin) 干了什么?

以下是我对Vue官网的一些摘录和个人的理解

Vue.use( plugin )

参数:

{Object | Function} plugin

用法:

安装 Vue.js 插件。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法

install 方法调用时,会将 Vue 作为参数传入。

该方法需要在调用 new Vue() 之前被调用。

当 install 方法被同一个插件多次调用,插件将只会被安装一次。

举个栗子:

Vue.use(MyPlugin)   // 相当于:1)如果MyPlugin是一个对象,等价于 MyPlugin.install(Vue)。

               2)如果MyPlug是一个函数, 则等价于 MyPlugin(Vue)

结论:如果引入的插件是一个对象,那么此对像必须有install 方法,因为 Vue.use要用。

如果是函数,直接当做install方法调用。

由上面的结论可知,如果我们开发的插件是以对象形式出现,那么它的基本结构应该如下所示:

(以下摘录自Vue官方文档)

// MyPlugin.js 文件

MyPlugin.install = function (Vue, options) {

// 1. 添加全局方法或属性

Vue.myGlobalMethod = function () {

// 逻辑...

}

// 2. 添加全局资源

Vue.directive(‘my-directive‘, {

bind (el, binding, vnode, oldVnode) {

// 逻辑...

}

...

})

// 3. 注入组件

Vue.mixin({

created: function () {

// 逻辑...

}

...

})

// 4. 添加实例方法

Vue.prototype.$myMethod = function (methodOptions) {

// 逻辑...

}

}

export default MyPlugin

到此,你可能对如何在全局中添加方法有所感悟,但对于如何调用此方法并在页面中显示相应的内容可能还是有所疑问。

下面,就跟随我的脚步,依照我写的demo一起学习下吧。

以下是我写的 Vue 插件 的小demo

目标:

固定在窗口顶部的消息提示窗

开发流程:

1、首先编写出符合要求的组件模板

// message.vue
<template>
  <div class="ive-msg-block" v-if="isShowing">{{msg}}</div>
</template>
<script>
export default {
  data () {
    return {
      msg: ‘‘,
      isShowing: false
    }
  },
  methods: {
    show (notice) {
      this.msg = notice.msg
      this.isShowing = true
      let duration = notice.duration || 1500
      setTimeout(() => {
        this.isShowing = false
      }, duration)
    }
  }
}
</script>
<style scoped>
  .ive-msg-block {
    position: fixed;
    top: 50px;
    left: 50%;
    transform: translate(-50%, 0);
    background-color: white;
  }
</style>

2、利用 Vue.extend() 方法对其进行初始化封装

// message.js
import Vue from ‘vue‘
import message from ‘./message.vue‘

var _msgConstructor = Vue.extend(message)
var imessage = () => {
  // 防止多次注册
  if (imessage.installed) return
  // 获取实例(此处可通过传递属性值给模板,模板可通过props属性接受)
  var instance = new _msgConstructor()
  // 获取DOM,并挂载到body中
  var _msgComponent = instance.$mount()
  document.body.appendChild(_msgComponent.$el)
  // 返回需要后需添加到Vue全局中的方法和属性
  return {
    component: instance,
    notice (noticeProps) {
      instance.show(noticeProps)
    }
  }
}

export default imessage

3、由于我想要写的插件是以对象的形式暴露出去,故一定要记得添加install方法,并在install方法中,将插件需要用到的方法添加到Vue的原型链中。

// index.js
import notification from ‘./message‘
let messageInstance

function getMessageInstance () {
  messageInstance = notification && notification()
  return messageInstance
}

// 调用初始化方法,获得实例并挂载到html中,并根据传入的参数显示对应的消息和显示时长
function notice (options) {
  let instance = getMessageInstance()
  instance.notice(options)
}
// 此处你可能有疑惑,为什么做了许多重复的事,其实本来我想实现的插件功能应该更加强大,但是初学遇到许多问题就暂时先实现一个简单的功能,然后预留接口,方便后续扩展
export default {
  name: ‘Message‘,
  install (Vue) {
    Vue.prototype.$Message = this
  },
  show (options) {
    this.message(options)
  },
  message (options) {
    notice(options)
  }
}

4、最后,在入口文件引入并注册

import  Message from ‘./Plugins/index‘
Vue.use(Message)

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: ‘#app‘,
  router,
  components: { App },
  template: ‘<App/>‘
})

总结:这是我写的插件初版原稿,其中有许多可以优化的地方,也有许多可以扩展的地方,比如可以参照其他成熟UI组件的样式,添加多种样式的提示框,可以调节窗口的位置,可以手动关闭等功能。

这篇文章主要的目的是为了记录下我从小白到入门的学习过程,同时也希望能对其他想要学习Vue的朋友们有所帮助。

原文地址:https://www.cnblogs.com/moshou-dota/p/9817916.html

时间: 2024-08-24 23:08:53

Vue 开发自定义插件学习记录 -- 入门的相关文章

浅析vue封装自定义插件

在使用vue的过程中,经常会用到Vue.use,但是大部分对它一知半解,不了解在调用的时候具体做了什么,因此,本文简要概述下在vue中,如何封装自定义插件. 在开始之前,先补充一句,其实利用vue封装自定义插件的本质就是组件实例化的过程或者指令等公共属性方法的定义过程,比较大的区别在于封装插件需要手动干预,就是一些实例化方法需要手动调用,而Vue的实例化,很多逻辑内部已经帮忙处理掉了.插件相对于组件的优势就是插件封装好了之后,可以开箱即用,而组件是依赖于项目的.对组件初始化过程不是很熟悉的可以参

基于Cordova5.0开发自定义插件(android)

1.开发插件java部分 2.配置java插件 3.编写js部分代码 4.js配置 5.html中调用 最重要的:源代码下载 版权声明:本文为博主原创文章,未经博主允许不得转载.

自定义插件学习-弹框2

;(function($) { $.alerts = { verticalOffset: -75, horizontalOffset: 100, repositionOnResize: true, overlayOpacity: 0.50, overlayColor: "#FFF", draggable: true, okButton: "确 定", cancelButton: "取 消", dialogClass: null, alert: f

python开发微信支付学习记录(转)

前言 微信支付是由微信及财付通联合推出的移动支付创新产品.如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑. 要想开发顺利进行,首先要对业务流程有个清晰的认识.这里以微信公众号支付为例,因此也借用微信支付官方文档中的业务流程图: 接下来来关注几个开发过程中的关键点,包括: 1.生成商户订单与调用统一下单 API 2.微信服务器交互的数据格式 3.公众号支付下网页内通过 JS-API 调起支付 4.异步通知商户支付结果(回调) 一.

深入学习jQuery自定义插件

原文地址:jQuery自定义插件学习 1.定义插件的方法 对象级别的插件扩展,即为jQuery类的实例增加方法, 调用:$(选择器).函数名(参数);      $(‘#id’).myPlugin(options); 定义的方式: $.fn.extend({ "函数名":function(自定义参数){ //这里写插件代码 } }); //或者是 $.fn.函数名 = function(options){ //这里写插件代码 } 类级别的方法,就是扩展jQuery类本身的方法,为它增加

前端学习---移动端vue开发踩坑记

前言: 大概两个月前投身于一个项目中去,项目是一个移动端的项目,所选用的框架是时下比较流行的vue.这篇文章也是针对这个项目和以前自己学习时的一些总结,包括一些通用的移动端开发要注意的事项.vue开发遇到的一些问题.本文的目的是为了在以后的开发中我们可以避免这些坑,提高我们的开发效率. 一.移动端开发特有问题: 1.移动端样式的兼容性: 在当前移动端的开发要面对各种不同的手机,不同的手机DPI也是不同的,比如Iphone 8的DPI就是2,Iphone 8P的DPI就是3.为了让页面可以兼容不同

Vue学习笔记入门篇——组件的通讯

本文为转载,原文:Vue学习笔记入门篇--组件的通讯 组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B.它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件.然而,在一个良好定义的接口中尽可能将父子组件解耦是很重要的.这保证了每个组件可以在相对隔离的环境中书写和理解,也大幅提高了组件的可维护性和可重用性.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props 向下传递

Android开发技术周报183学习记录

Android开发技术周报183学习记录 教程 Android性能优化来龙去脉总结 记录 一.性能问题常见 内存泄漏.频繁GC.耗电问题.OOM问题. 二.导致性能问题的原因 1.人为在ui线程中做了轻微的耗时操作,导致ui线程卡顿. 2.layout过于复杂,无法在16ms完成渲染.使用RelativeLayout替换LinearLayout,说是可以减少布局层次,然而,现在不再建议使用RelativeLayout,因为ConstraintLayout才是一个更高性能的消灭布局层级的神器.Co

Vue学习笔记入门篇——组件的使用

本文为转载,原文:Vue学习笔记入门篇--组件的使用 组件定义 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 组件使用 注册 注册一个全局组件,你可以使用 Vue.component(tagName, options).组件在注册之后,便可以在父实例的模块中以自定义元素 的形式使用.