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

moshou-dota 2018-10-19 原文

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的朋友们有所帮助。

发表于 2018-10-19 17:59 moshou_dota 阅读() 评论() 编辑 收藏

 

版权声明:本文为moshou-dota原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/moshou-dota/p/9817916.html

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

  1. webpack2学习(二)

    目录 在main.js中操作dom 修改页面内容 完善webpack配置文件 webpack最重要的功能 &# […]...

  2. mpvue2.0 支持wx.getUserInfo获取用户信息授权的修改

    mpvue2.0 支持wx.getUserInfo获取用户信息授权的修改 一、背景      在使用美团的mp […]...

  3. vscode+eslint自动格式化vue代码的方法

    前言 使用vscode开发vue项目的时候,为了编码格式的统一化,使用eslint规范进行格式化。此时通过es […]...

  4. Angular 和 Vue 使用的对比总结 — 脚手架

    前言   之前是用Vue的,现在由于工作原因,开始使用Angular。分别是Vue2和Angular5入的坑。 […]...

  5. vue cli3.0 封装组件全局引入js文件并发布到npm

    首先用 vue create创建一个项目 当前的项目目录是这样的:   首先需要创建一个 packages 目 […]...

  6. JQuery案例和插件机制

    案例-广告显示和隐藏需求:   1.当页面加载完,3秒后,自动显示广告   2.广告显示5秒后,自动消失分析:   1.使用定时器完成,setTimeout(执行一次定时器)   2.分析发现JQuery的显示和隐藏动漫...

  7. NuxtJS项目——插件

      Nuxt.js允许在运行Vue.js应用程序之前执行js插件,而nuxt.config.js文件中可以通过 […]...

  8. Vue packages version mismatch: 版本始终不对 – yingzi__block

    Vue packages version mismatch: 版本始终不对 vue安装依赖包时,遇到了一个问题 […]...

随机推荐

  1. 都9012年了,还在自己写分布式锁?

    1.  Redisson Redisson是Redis官方推荐的Java版的Redis客户端。它提供的功能非常 […]...

  2. 谷歌浏览器扩展插件的提取和离线安装(解决此扩展程序可能已损坏问题)

    一、谷歌浏览器插件的提取 1.在我的电脑地址栏输入以下地址,找到扩展程序目录(默认装在c盘)   C:\Use […]...

  3. 跟着大彬读源码 – Redis 3 – 服务器如何响应客户端请求?(下)

    继续我们上一节的讨论。服务器启动了,客户端也发送命令了。接下来,就要到服务器“表演”的时刻了。 1 服务器处理 […]...

  4. HTML5

    HTML5 欢迎访问我的个人博客Coder HTML5属于上一代HTML的新迭代语言,设计HTML5最主要的目 […]...

  5. 位(bit)、字节(byte)、字符、编码之间的关系 位、字节、字符的区别

    参考: https://blog.csdn.net/prdslf001001/article/details/ […]...

  6. OSGI各个容器之间的类加载器是怎么进行隔离的

    OSGI各个容器之间的类加载器是怎么进行隔离的 什么是osgi: OSGi为java平台提供了动态模块化的特性 […]...

  7. CSAPP:逆向工程【缓冲区溢出攻击】

    逆向工程【缓冲区溢出攻击】 任务描述 掌握函数调用时的栈帧结构,利用输入缓冲区的溢出漏洞,将攻击代码嵌入当前程 […]...

  8. 命令行模式运行jmeter,主从方式运行jmeter

    jmeter很小,很快,使用方便,可以在界面运行,可以命令行运行。简单介绍下命令行运行的方式: sh jmet […]...

展开目录

目录导航