创建你自己定制的vuejs plugin扩展app的功能

什么是vuejs plugin插件

vuejs plugin插件是一个向你的app注入新的全局功能的强大但又简约的方式。从概念上来说,vue plugin非常简单,它就是一个包含了install方法的object.而这个install方法有两个参数会传入,第一个参数为全局的Vue构造函数,第二个参数则是options对象.

你的首个插件(任何组件mounted就自动打印mounted log日志)

我们先写一个简单的vue plugin,实现的功能是每个component,当mounted时就能够打印相应的已加载信息

// This is your plugin object. It can be exported to be used anywhere.
const MyPlugin = {
  // The install method is all that needs to exist on the plugin object.
  // It takes the global Vue object as well as user-defined options.
  install(Vue, options) {
    // We call Vue.mixin() here to inject functionality into all components.
      Vue.mixin({
      // Anything added to a mixin will be injected into all components.
      // In this case, the mounted() method runs when the component is added to the DOM.
      mounted() {
        console.log('Mounted!');
      }
    });
  }
};

export default MyPlugin;

这个插件本质上做的工作就是通过调用Vue.mixin向Vue全局构造函数中添加相应的mounted hook

随后,我们通过vue.use来调用这个plugin

import Vue from 'vue'
import MyPlugin from './my-vue-plugin.js'
import App from './App.vue'

// The plugin is loaded here.
Vue.use(MyPlugin)

new Vue({
  el: '#app',
  render: h => h(App)
});

需要注意的是:所有的plugin都必须在调用new Vue()之前被Vue.use来初始化

你可能在疑惑,为什么我不能直接在main.js中调用Vue.mixin()来实现同样的功能呢?很重要的原因是因为我们是向Vue添加全局的functionality,而不是在向app添加功能。

添加其他的功能(installing app-wide components and directives)

比如,如果希望通过plugin方式来打包并且分发components以及directives的话,可以写以下代码:

import MyComponent from './components/MyComponent.vue';
import MyDirective from './directives/MyDirective.js';

const MyPlugin {
  install(Vue, options) {
    Vue.component(MyComponent.name, MyComponent)
    Vue.directive(MyDirective.name, MyDirective)
  }
};

export default MyPlugin;

修改全局的Vue构造函数对象

看下面的代码:

const MyPlugin {
  install(Vue, options) {
    Vue.myAddedProperty = 'Example Property'
    Vue.myAddedMethod = function() {
      return Vue.myAddedProperty
    }
  }
};

export default MyPlugin;

修改Vue实例化instance

通过javascript的原型机制我们知道所有的vue component都是Vue构造函数new出来的instance,我们只要修改构造函数的prototype就能对instance统一添加新的功能。

const MyPlugin {
  install(Vue, options) {
    Vue.prototype.$myAddedProperty = 'Example Property'
    Vue.prototype.$myAddedMethod = function() {
      return this.$myAddedProperty
    }
  }
};

export default MyPlugin;

上面添加的所有属性或者方法都将在vue component instance中能够通过this.$myAddedProperty来访问.

添加组件的lifecycle hooks或者属性

const MyPlugin = {
  install(Vue, options) {

    Vue.mixin({
      mounted() {
        console.log('Mounted!');
      }
    });

  }
};

export default MyPlugin;

自动安装

对于那些没有使用webpack等模块打包工具的开发者来说,他们往往会将yourplugin.js放在vuejs的script tag之后来引用,可以通过在my-vue-plugin.js中的以下代码来自动安装

// Automatic installation if Vue has been added to the global scope.
if (typeof window !== 'undefined' && window.Vue) {
  window.Vue.use(MyPlugin)
}

 

posted @ 2019-07-08 14:20  世有因果知因求果  阅读(2869)  评论(0编辑  收藏  举报