做自(zì)由與創造的先行者

組件注冊

Vue.js中文(wén)手冊

此章節假設你(nǐ)已經看(kàn)過了(le)組件基礎。若你(nǐ)還不了(le)解組件是什(shén)麽,請(qǐng)先閱讀該章節。

一個 Vue 組件在使用(yòng)前需要先被“注冊”,這(zhè)樣 Vue 才能(néng)在渲染模闆時(shí)找到(dào)其對(duì)應的實現(xiàn)。組件注冊有兩種方式:全局注冊和(hé)局部注冊。

全局注冊 ​

我們可以使用(yòng) Vue 應用(yòng)實例的 app.component() 方法,讓組件在當前 Vue 應用(yòng)中全局可用(yòng)。

js

import { createApp } from 'vue'

const app = createApp({})

app.component(

// 注冊的名字

'MyComponent',

// 組件的實現(xiàn)

{

/* ... */

}

)

如果使用(yòng)單文(wén)件組件,你(nǐ)可以注冊被導入的 .vue 文(wén)件:

js

import MyComponent from './App.vue'

app.component('MyComponent', MyComponent)

app.component() 方法可以被鏈式調用(yòng):

js

app

.component('ComponentA', ComponentA)

.component('ComponentB', ComponentB)

.component('ComponentC', ComponentC)

全局注冊的組件可以在此應用(yòng)的任意組件的模闆中使用(yòng):

template

<!-- 這(zhè)在當前應用(yòng)的任意組件中都可用(yòng) -->

<ComponentA/>

<ComponentB/>

<ComponentC/>

所有的子組件也(yě)可以使用(yòng)全局注冊的組件,這(zhè)意味着這(zhè)三個組件也(yě)都可以在彼此内部使用(yòng)。

局部注冊 ​

全局注冊雖然很(hěn)方便,但(dàn)有以下(xià)幾個問題:

全局注冊,但(dàn)并沒有被使用(yòng)的組件無法在生産打包時(shí)被自(zì)動移除 (也(yě)叫“tree-shaking”)。如果你(nǐ)全局注冊了(le)一個組件,即使它并沒有被實際使用(yòng),它仍然會(huì)出現(xiàn)在打包後的 JS 文(wén)件中。

全局注冊在大(dà)型項目中使項目的依賴關系變得不那麽明(míng)确。在父組件中使用(yòng)子組件時(shí),不太容易定位子組件的實現(xiàn)。和(hé)使用(yòng)過多的全局變量一樣,這(zhè)可能(néng)會(huì)影響應用(yòng)長期的可維護性。

相比之下(xià),局部注冊的組件需要在使用(yòng)它的父組件中顯式導入,并且隻能(néng)在該父組件中使用(yòng)。它的優點是使組件之間的依賴關系更加明(míng)确,并且對(duì) tree-shaking 更加友好(hǎo)。

局部注冊需要使用(yòng) components 選項:

vue

<script>

import ComponentA from './ComponentA.vue'

export default {

components: {

ComponentA

}

}

</script>

<template>

<ComponentA />

</template>

對(duì)于每個 components 對(duì)象裏的屬性,它們的 key 名就是注冊的組件名,而值就是相應組件的實現(xiàn)。上(shàng)面的例子中使用(yòng)的是 ES2015 的縮寫語法,等價于:

js

export default {

components: {

ComponentA: ComponentA

}

// ...

}

請(qǐng)注意:局部注冊的組件在後代組件中并不可用(yòng)。在這(zhè)個例子中,ComponentA 注冊後僅在當前組件可用(yòng),而在任何的子組件或更深層的子組件中都不可用(yòng)。

組件名格式 ​

在整個指引中,我們都使用(yòng) PascalCase 作(zuò)爲組件名的注冊格式,這(zhè)是因爲:

PascalCase 是合法的 JavaScript 标識符。這(zhè)使得在 JavaScript 中導入和(hé)注冊組件都很(hěn)容易,同時(shí) IDE 也(yě)能(néng)提供較好(hǎo)的自(zì)動補全。

<PascalCase /> 在模闆中更明(míng)顯地表明(míng)了(le)這(zhè)是一個 Vue 組件,而不是原生 HTML 元素。同時(shí)也(yě)能(néng)夠将 Vue 組件和(hé)自(zì)定義元素 (web components) 區(qū)分開(kāi)來(lái)。

在單文(wén)件組件和(hé)内聯字符串模闆中,我們都推薦這(zhè)樣做。但(dàn)是,PascalCase 的标簽名在 DOM 模闆中是不可用(yòng)的,詳情參見 DOM 模闆解析注意事(shì)項。

爲了(le)方便,Vue 支持将模闆中使用(yòng) kebab-case 的标簽解析爲使用(yòng) PascalCase 注冊的組件。這(zhè)意味着一個以 MyComponent 爲名注冊的組件,在模闆中可以通過 <MyComponent> 或 <my-component> 引用(yòng)。這(zhè)讓我們能(néng)夠使用(yòng)同樣的 JavaScript 組件注冊代碼來(lái)配合不同來(lái)源的模闆。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:Props
上(shàng)一篇:組件基礎