Skip to content

注册组件

全局注册

假设你的 src\components 文件夹内有一个名为 MyComponent.vue 的组件。

我们可以在 src/main.js 里面修改,以全局注册这个组件。

js
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'

// createApp(App).mount('#app')

// 以下为新增
import MyComponent from './components/MyComponent.vue'
const app = createApp(App)
app.component('MyComponent', MyComponent)
app.mount('#app')

其中 component 函数支持链式调用,可以这样写:

js
app.component('MyComponentA', MyComponentA)
	.component('MyComponentB', MyComponentB)
	.component('MyComponentC', MyComponentC)

使用

可以在此项目的任意模板中使用:

html
<ComponentA/>
<ComponentB/>
<ComponentC/>

弊端

  • 全局注册的组件,即使未被使用也会被打包
  • 全局注册的组件,在大型项目中的依赖关系不会显得那么明确

局部注册

<script setup>

在单个组件的 <script setup> 中,import 导入另一个组件后,即可在模板中直接使用,后续用法与全局注册的组件没啥区别。

没有 <script setup>

需要使用 components 选项来显式注册:

js
import ComponentA from './ComponentA.js'

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

对于每个 components 对象里的属性,它们的 key 名就是注册的组件名,而值就是相应组件的实现。上面的例子中使用的是 ES2015 的缩写语法,等价于:

js
export default {
  components: {
    ComponentA: ComponentA
  }
  // ...
}

请注意:局部注册的组件在后代组件中*不*可用。在这个例子中,ComponentA 注册后仅在当前组件可用,而在任何的子组件或更深层的子组件中都不可用。

补充

不能引入引入了本组件的组件,这就死循环了。