Skip to content

组件注册

组件只有先被"注册",才能被使用,注册组件分为:全局注册和局部注册

全局注册

使用Vue实例的.component()方法将组件注册在全局中,这样组件在当前Vue实例的任何地方都可以使用

js
import { createApp } from 'vue'
import App from './App.vue'
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'
const app = createApp(App)
app.component('ComponentA', ComponentA)
app.component('ComponentB', ComponentB)
app.mount('#app')

.component()方法可以被链式调用

js
app.component('ComponentA', ComponentA).component('ComponentB', ComponentB)

局部注册

全局注册面对的问题:

  • 全局注册的但没有使用的组件,无法再生产打包时被自动移除,即使没有使用也会出现在打包后的js文件中
  • 当项目变大,全局注册会使项目中 的依赖关系变得不那么明确,在父组件中使用时不太容易定位子组件的实现,可能会影响长期的可维护性

相比之下,在需要的时候在父组件中显示导入称为局部注册.导入的组件只能在父组件中使用,使组件之间的依赖关系更加明确,并且在没有使用时打包可以移除

html
<script setup>
  import ComponentA from './ComponentA.vue'
</script>

<template>
  <ComponentA />
</template>
javascript
import ComponentA from './ComponentA.js'

export default {
  components: {
    ComponentA,
  },
  setup() {
    // ...
  },
}

对于components对象里的属性,他们的key名就是注册的组件的名字,而值就是对应组件的实例

js
import ComponentA from './ComponentA.js'
import ComponentB from './ComponentB.js'
export default {
  components: {
    ComponentA,
    ComponentB,
  },
  setup() {
    // ...
  },
}

注册语法糖

Vue 3中,Vue为组件注册提供了语法糖,使用defineComponent函数来定义组件,这样就可以直接在components选项中声明组件,而不需要再单独导入

js
import { defineComponent } from 'vue'
import ComponentA from './ComponentA.js'
import ComponentB from './ComponentB.js'
export default defineComponent({
  components: {
    ComponentA: ComponentA,
    ComponentB: ComponentB,
  },
  setup() {
    // ...
  },
})

注意: 局部注册的组件只能在当前组件中使用,任意当前组件的父组件或子组件中都是不可用的

组件命名格式

推荐使用 PascalCase 作为组件名的注册格式
1.PascalCase 是合法的 JavaScript 标识符。这使得在 JavaScript 中导入和注册组件都很容易,同时 IDE 也能提供较好的自动补全。

2.<PascalCase /> 在模板中更明显地表明了这是一个 Vue 组件,而不是原生 HTML 元素。同时也能够将 Vue 组件和自定义元素 (web components) 区分开来。

需要注意,我们之前说过,在DOM内模板中需要使用短横线连接符的方式命名.

为了方便,在Vue中支持将 kebab-case 的标签解析为使用 PascalCase 注册的组件,例如:

html
<component-a></component-a>
<ComponentA></ComponentA>