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) 创建之前发生。
局部注册
- 通过 Babel 和 webpack 使用 ES2015 模块。
import ComponentA from './ComponentA.vue'
export default {
components: {
ComponentA
},
// ...
}
<component-a></component-a>
- 注意在 ES2015+ 中,在对象中放一个类似
ComponentA的变量名其实是ComponentA: ComponentA的缩写,即这个变量名同时是:
- 用在模板中的自定义元素的名称
- 包含了这个组件选项的变量名
基础组件的自动化全局注册
vue插件
插件
- 插件通常用来为 Vue 添加全局功能。插件的功能范围没有严格的限制——一般有下面几种:
- 添加全局方法或者 property。如:vue-custom-element
- 添加全局资源:指令/过滤器/过渡等。如 vue-touch
- 通过全局混入来添加一些组件选项。如 vue-router
- 添加 Vue 实例方法,通过把它们添加到
Vue.prototype上实现。 - 一个库,提供自己的 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组件和插件的区别
- 组件 (Component) 是主要服务于业务模块,它的目标是 xxx[业务].vue。Vue.component
- 插件 (Plugin) 是用来增强全局的功能模块,它的目标是 Vue 本身。Vue.use
- 列如:在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一段代码。
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 下
- 类的方法和实例的方法