Vue组件和插件

276 阅读2分钟

vue组件

  • 组件是可复用的 Vue 实例,且带有一个名字.

组件名

使用 kebab-case

Vue.component('my-component-name', { /* ... */ })
  • 当使用 kebab-case (短横线分隔命名) 定义一个组件时,你也必须在引用这个自定义元素时使用 kebab-case,例如 <my-component-name>

使用 PascalCase

Vue.component('MyComponentName', { /* ... */ })
  • 当使用 PascalCase (首字母大写命名) 定义一个组件时,你在引用这个自定义元素时两种命名法都可以使用。也就是说 <my-component-name> 和 <MyComponentName> 都是可接受的。注意,尽管如此,直接在 DOM (即非字符串的模板) 中使用时只有 kebab-case 是有效的。

全局注册

Vue.component('my-component-name', {  // ... 选项 ... })
  • 这些组件是全局注册的。也就是说它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中。比如:
Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ })

new Vue({ el: '#app' })
<div id="app">
  <component-a></component-a>
  <component-b></component-b>
  <component-c></component-c>
</div>
  • 在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用.
  • 注意全局注册的行为必须在根 Vue 实例 (通过 new Vue) 创建之前发生

局部注册

  1. 通过 Babel 和 webpack 使用 ES2015 模块。
import ComponentA from './ComponentA.vue'

export default {
  components: {
    ComponentA
  },
  // ...
}
<component-a></component-a>
  1. 注意在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写,即这个变量名同时是:
  • 用在模板中的自定义元素的名称
  • 包含了这个组件选项的变量名

基础组件的自动化全局注册

vue插件

插件

  • 插件通常用来为 Vue 添加全局功能。插件的功能范围没有严格的限制——一般有下面几种:
  1. 添加全局方法或者 property。如:vue-custom-element
  2. 添加全局资源:指令/过滤器/过渡等。如 vue-touch
  3. 通过全局混入来添加一些组件选项。如 vue-router
  4. 添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。
  5. 一个库,提供自己的 API,同时提供上面提到的一个或多个功能。如 vue-router

使用插件

  • 通过全局方法 Vue.use() 使用插件。它需要在你调用 new Vue() 启动应用之前完成:
// 调用 `MyPlugin.install(Vue)`
Vue.use(MyPlugin)

new Vue({
  // ...组件选项
})
Vue.use(MyPlugin, { someOption: true })
  • Vue.use 会自动阻止多次注册相同插件,即使多次调用也只会注册一次该插件。
var Vue = require('vue')
var VueRouter = require('vue-router')

Vue.use(VueRouter)

开发插件

  • Vue.js 的插件应该暴露一个 install 方法。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象:
MyPlugin.install = function (Vue, options) {
  // 1. 添加全局方法或 property
  Vue.myGlobalMethod = function () {
    // 逻辑...
  }

  // 2. 添加全局资源
  Vue.directive('my-directive', {
    bind (el, binding, vnode, oldVnode) {
      // 逻辑...
    }
    ...
  })

  // 3. 注入组件选项
  Vue.mixin({
    created: function () {
      // 逻辑...
    }
    ...
  })

  // 4. 添加实例方法
  Vue.prototype.$myMethod = function (methodOptions) {
    // 逻辑...
  }
}

vue组件和插件的区别

  1. 组件 (Component) 是主要服务于业务模块,它的目标是 xxx[业务].vue。Vue.component
  2. 插件 (Plugin) 是用来增强全局的功能模块,它的目标是 Vue 本身。Vue.use
  3. 列如:在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一段代码。
export const Plugin = {
    install(Vue) {
        Vue.component...
        Vue.mixins...
        Vue...
        // 我们也可以在install里面执行其他函数,Vue会将this指向我们的插件
        console.log(this) // {install: ...,utils: ...}
        this.utils(Vue) // 执行utils函数
        console.log(this.COUNT) // 0
    },
    utils(Vue) {
            Vue...
                    console.log(Vue) // Vue
    },
    COUNT: 0
}

Vue.extend( options )

  • 参数

    • {Object} options
  • 用法

    使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。

    data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数

<div id="mount-point"></div>
// 创建构造器
var Profile = Vue.extend({
  template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
  data: function () {
    return {
      firstName: 'Walter',
      lastName: 'White',
      alias: 'Heisenberg'
    }
  }
})
// 创建 Profile 实例,并挂载到一个元素上。
new Profile().$mount('#mount-point')
<p>Walter White aka Heisenberg</p>

局部注册和全局注册不同

  • 全局组件的 Vue.options.components
  • 局部组件的 vm.$options.components 下
  • 类的方法和实例的方法