Регистрация компонентов
Эта страница предполагает, что вы уже прочитали Основы компонентов.
Компонент Vue должен быть «зарегистрирован», чтобы Vue знал, где найти его реализацию, когда он встречается в шаблоне. Существует два способа регистрации компонентов: глобально и локально.
Глобальная регистрация
Мы можем сделать компоненты доступными глобально в текущем приложении Vue с помощью метода .component()
:
js
import { createApp } from 'vue'
const app = createApp({})
app.component(
// зарегистрированное имя
'MyComponent',
// реализация
{
/* ... */
}
)
При использовании SFC вы будете регистрировать импортированные файлы .vue
:
js
import MyComponent from './App.vue'
app.component('MyComponent', MyComponent)
Метод .component()
можно объединять в цепочку:
js
app
.component('ComponentA', ComponentA)
.component('ComponentB', ComponentB)
.component('ComponentC', ComponentC)
Глобально зарегистрированные компоненты могут быть использованы в шаблоне любого компонента в этом приложении:
template
<!-- Это будет работать в любом компоненте внутри приложения -->
<ComponentA/>
<ComponentB/>
<ComponentC/>
Это относится даже ко всем подкомпонентам, то есть все три компонента будут доступны внутри друг друга.
Локальная регистрация
Несмотря на удобство, глобальная регистрация имеет несколько недостатков:
Глобальная регистрация не позволяет системам сборки удалять неиспользуемые компоненты (так называемая «древовидная» регистрация). Если вы зарегистрируете компонент в глобальном порядке, но в итоге не будете использовать его в своем приложении, он всё равно будет включен в финальный пакет.
Глобальная регистрация делает отношения зависимости менее явными в больших приложениях. Это затрудняет поиск реализации дочернего компонента по использующему его родительскому компоненту. Это может повлиять на долгосрочную работоспособность, как и использование слишком большого количества глобальных переменных.
Локальная регистрация ограничивает доступность зарегистрированных компонентов только текущим компонентом. Это делает отношения зависимости более явными и более дружелюбными к деревьям.
При использовании SFC с <script setup>
импортированные компоненты можно использовать локально без регистрации:
vue
<script setup>
import ComponentA from './ComponentA.vue'
</script>
<template>
<ComponentA />
</template>
При использовании не <script setup>
, вам нужно использовать опцию components
:
js
import ComponentA from './ComponentA.js'
export default {
components: {
ComponentA
},
setup() {
// ...
}
}
Для каждого свойства в объекте components
ключом будет зарегистрированное имя компонента, а значением — реализация компонента. В приведённом выше примере используется сокращение свойств ES2015, и это эквивалентно:
js
export default {
components: {
ComponentA: ComponentA
}
// ...
}
Обратите внимание, что локально зарегистрированные компоненты не доступны в компонентах-потомках. В этом случае ComponentA
будет доступен только для текущего компонента, а не для всех его дочерних или потомственных компонентов.
Регистр имён компонентов
Во всём руководстве при регистрации компонентов мы используем имена в PascalCase. Это происходит потому, что:
Имена в PascalCase являются допустимыми идентификаторами JavaScript. Это упрощает импорт и регистрацию компонентов в JavaScript. Это также помогает IDE с автозавершением.
<PascalCase />
делает более очевидным, что это компонент Vue, а не родной HTML-элемент в шаблонах. Это также отличает компоненты Vue от пользовательских элементов (веб-компонентов).
Это рекомендуемый стиль при работе с SFC или шаблонами строк. Однако, как говорится в Предостережениях по разбору шаблонов в DOM, теги PascalCase не используются в DOM-шаблонах.
К счастью, Vue поддерживает разрешение тегов kebab-case для компонентов, зарегистрированных с использованием PascalCase. Это означает, что компонент, зарегистрированный как MyComponent
, может быть использован в шаблоне Vue (или внутри HTML-элемента, созданного Vue) как <MyComponent>
, так и <my-component>
. Это позволяет использовать одинаковый код регистрации JavaScript-компонента независимо от источника шаблона.