Vue 组件和插件的区别
理解 Vue 中组件和插件的定义、编写方式、注册方式和使用场景
问题
Vue 中组件和插件有什么区别?
解答
组件是什么
组件是把图形、非图形的各种逻辑抽象为一个统一概念来实现开发的模式。在 Vue 中,每一个 .vue 文件都可以视为一个组件。
组件的优势:
- 降低系统耦合度,在保持接口不变的情况下可以替换不同的组件
- 调试方便,可以用排除法直接移除组件或根据报错快速定位问题
- 提高可维护性,组件职责单一且可复用,优化代码可获得系统整体升级
插件是什么
插件用来为 Vue 添加全局功能,功能范围包括:
- 添加全局方法或属性
- 添加全局资源(指令/过滤器/过渡等)
- 通过全局混入添加组件选项
- 添加 Vue 实例方法(通过
Vue.prototype实现) - 提供自己的 API,同时提供上述一个或多个功能
编写形式
组件编写
单文件组件(最常见):
<template>
<div>component content</div>
</template>
<script>
export default {
// 组件选项
}
</script>
<style>
/* 样式 */
</style>
通过 template 属性编写:
// 外部定义模板
<template id="testComponent">
<div>component!</div>
</template>
Vue.component('componentA', {
template: '#testComponent'
})
// 或直接内联
Vue.component('componentB', {
template: `<div>component</div>`
})
插件编写
插件需要暴露一个 install 方法:
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) {
// 逻辑...
}
}
注册形式
组件注册
全局注册:
Vue.component('my-component-name', { /* ... */ })
局部注册:
const component1 = { /* ... */ }
export default {
components: {
component1
}
}
插件注册
使用 Vue.use() 注册:
Vue.use(MyPlugin, { /* 可选配置项 */ })
注意事项:
- 需要在
new Vue()之前完成插件注册 Vue.use会自动阻止多次注册相同插件
使用场景
组件:用来构成 App 的业务模块,目标是 App.vue,关注具体的 UI 和业务逻辑。
插件:用来增强 Vue 的功能模块,目标是 Vue 本身,关注框架能力的扩展。
关键点
- 组件是业务模块,插件是功能增强
- 组件通过
Vue.component或components选项注册,插件通过Vue.use()注册 - 组件编写为
.vue文件或配置对象,插件需要实现install方法 - 插件注册必须在
new Vue()之前,且同一插件只会注册一次 - 组件关注 UI 和业务,插件关注全局功能扩展(如路由、状态管理)
目录