# Глобальное API
При использовании сборки с CDN доступ к функциям глобального API можно получить через глобальный объект Vue
, например:
const { createApp, h, nextTick } = Vue
При использовании ES-модулей, их можно импортировать напрямую:
import { createApp, h, nextTick } from 'vue'
Глобальные функции для работы с реактивностью, такие как reactive
и ref
, задокументированы отдельно. Подробнее о них можно изучить в разделе Reactivity API.
# createApp
Возвращает экземпляр приложения, который предоставляет контекст приложения. Всё дерево компонентов, смонтированных экземпляром приложения, имеет один и тот же контекст.
const app = createApp({})
После createApp
можно цепочкой вызывать другие методы, их перечень можно найти в API приложения
# Аргументы
Первым аргументом функция получает объект настроек корневого компонента:
const app = createApp({
data() {
return {
...
}
},
methods: {...},
computed: {...}
...
})
2
3
4
5
6
7
8
9
10
Вторым аргументом можно передать корневые входные параметры приложения:
const app = createApp(
{
props: ['username']
},
{ username: 'Evan' }
)
2
3
4
5
6
<div id="app">
<!-- Отобразит 'Evan' -->
{{ username }}
</div>
2
3
4
# Типы
interface Data {
[key: string]: unknown
}
export type CreateAppFunction<HostElement> = (
rootComponent: PublicAPIComponent,
rootProps?: Data | null
) => App<HostElement>
2
3
4
5
6
7
8
# h
Возвращает «виртуальную ноду», для сокращения называемую как VNode: простой объект, содержащий информацию для Vue какой узел должен отобразиться на странице, включая описания любых дочерних узлов. Предназначается для написания render-функций вручную:
render() {
return h('h1', {}, 'Какой-то заголовок')
}
2
3
# Аргументы
Принимает три аргумента: type
, props
и children
# type
Тип:
String | Object | Function
Подробности:
Имя HTML-тега, компонента или асинхронного компонента. Использование функции, возвращающей
null
будет отрисовывать комментарий. Этот параметр обязателен.
# props
Тип:
Object
Подробности:
Объект, с соответствующими атрибутами, входными параметрами и событиями, которые будут использоваться в шаблоне. Опционально.
# children
Тип:
String | Array | Object
Подробности:
Дочерние VNode, созданные с помощью
h()
, или использование строк для получения «текстовых VNode», или объект со слотами. Опционально.h('div', {}, [ 'Some text comes first.', h('h1', 'A headline'), h(MyComponent, { someProp: 'foobar' }) ])
1
2
3
4
5
6
7
# defineComponent
Реализация defineComponent
ничего не делает, но возвращает переданный ему объект. Однако, с точки зрения типизации, возвращаемое значение имеет синтетический тип конструктора для создаваемых render-функций, TSX и поддержки инструментария IDE.
# Аргументы
Объект с опциями компонента
import { defineComponent } from 'vue'
const MyComponent = defineComponent({
data() {
return { count: 1 }
},
methods: {
increment() {
this.count++
}
}
})
2
3
4
5
6
7
8
9
10
11
12
Или функция setup
, имя которой будет использовано в качестве имени компонента
import { defineComponent, ref } from 'vue'
const HelloWorld = defineComponent(function HelloWorld() {
const count = ref(0)
return { count }
})
2
3
4
5
6
# defineAsyncComponent
Создаёт асинхронный компонент, который будет загружен только при необходимости.
# Аргументы
Обычно, в defineAsyncComponent
передают функцию-фабрику, возвращающую Promise
. Его коллбэк resolve
должен вызываться при получении описания компонента с сервера. Также можно вызываться reject(reason)
для обозначения неудачи при загрузке.
import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent(() =>
import('./components/AsyncComponent.vue')
)
app.component('async-component', AsyncComp)
2
3
4
5
6
7
При использовании локальной регистрации компонента также можно напрямую указывать функцию, которая возвращает Promise
:
import { createApp, defineAsyncComponent } from 'vue'
createApp({
// ...
components: {
AsyncComponent: defineAsyncComponent(() =>
import('./components/AsyncComponent.vue')
)
}
})
2
3
4
5
6
7
8
9
10
Для продвинутого использования defineAsyncComponent
может принимать объект следующего формата:
import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent({
// Функция-фабрика
loader: () => import('./Foo.vue')
// Компонент загрузки, используемый во время загрузки асинхронного компонента
loadingComponent: LoadingComponent,
// Компонент ошибки, используемый в случае неудачи при загрузке
errorComponent: ErrorComponent,
// Ожидание перед показом компонента загрузки. По умолчанию: 200ms.
delay: 200,
// Компонент ошибки будет отображаться, если был указан таймаут
// и время ожидания превышено. По умолчанию: Infinity.
timeout: 3000,
// Определение является ли компонент suspensible. По умолчанию: true.
suspensible: false,
/**
* Обработчик ошибки
* @param {*} error Объект ошибки с сообщением
* @param {*} retry Функция, определяющая повторные попытки загрузки, при promise rejects
* @param {*} fail Конец обработки ошибок
* @param {*} attempts Максимальное число повторных попыток
*/
onError(error, retry, fail, attempts) {
if (error.message.match(/fetch/) && attempts <= 3) {
// повтор при ошибках загрузки, максимум 3 попытки
retry()
} else {
// обратите внимание, retry/fail аналогичны resolve/reject для promise:
// один из них должен быть вызван для продолжения обработки ошибок.
fail()
}
},
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
См. также: Динамические и асинхронные компоненты
# resolveComponent
ВНИМАНИЕ
resolveComponent
можно использовать только внутри функций render
или setup
.
Позволяет разрешить component
по его имени, если он доступен в текущем экземпляре приложения.
Возвращает Component
или аргумент name
если не был найден.
const app = createApp({})
app.component('MyComponent', {
/* ... */
})
2
3
4
import { resolveComponent } from 'vue'
render() {
const MyComponent = resolveComponent('MyComponent')
}
2
3
4
# Аргументы
Принимает один аргумент: name
# name
Тип:
String
Подробности:
Имя загружаемого компонента.
# resolveDynamicComponent
ВНИМАНИЕ
resolveDynamicComponent
можно использовать только внутри функций render
или setup
.
Позволяет разрешить component
по аналогичному механизму как в <component :is="">
.
Возвращает Component
или новую созданную VNode
с именем компонента в качестве тега. Будет отображать предупреждение, если Component
не был найден.
import { resolveDynamicComponent } from 'vue'
render () {
const MyComponent = resolveDynamicComponent('MyComponent')
}
2
3
4
# Аргументы
Принимает один аргумент: component
# component
Тип:
String | Object (объект настроек компонента)
Подробности:
Подробности можно узнать в разделе динамические компоненты.
# resolveDirective
ВНИМАНИЕ
resolveDirective
можно использовать только внутри функций render
или setup
.
Позволяет разрешить directive
по её имени, если она доступна в текущем экземпляре приложения.
Возвращает Directive
или undefined
если не была найдена.
const app = createApp({})
app.directive('highlight', {})
2
import { resolveDirective } from 'vue'
render () {
const highlightDirective = resolveDirective('highlight')
}
2
3
4
# Аргументы
Принимает один аргумент: name
# name
Тип:
String
Подробности:
Имя загружаемой директивы.
# withDirectives
ВНИМАНИЕ
withDirectives
можно использовать только внутри функций render
или setup
.
Позволяет применять директивы к VNode. Возвращает VNode с применёнными директивами.
import { withDirectives, resolveDirective } from 'vue'
const foo = resolveDirective('foo')
const bar = resolveDirective('bar')
return withDirectives(h('div'), [
[foo, this.x],
[bar, this.y]
])
2
3
4
5
6
7
8
# Аргументы
Принимает два аргумента: vnode
и directives
.
# vnode
Тип:
vnode
Подробности:
Виртуальная нода, обычно созданная с помощью
h()
.
# directives
Тип:
Array
Подробности:
Массив директив.
Каждая директива сама по себе является массивом, что позволяет определять до 4 индексов, как показано в следующих примерах.
[directive]
— Директива сама по себе. Обязательно.
const MyDirective = resolveDirective('MyDirective') const nodeWithDirectives = withDirectives(h('div'), [[MyDirective]])
1
2[directive, value]
— Тоже, что и выше, плюс значение типаany
, которое присваивается директиве.
const MyDirective = resolveDirective('MyDirective') const nodeWithDirectives = withDirectives(h('div'), [[MyDirective, 100]])
1
2[directive, value, arg]
— Тоже, что и выше, плюс аргумент типаString
, т.е.click
вv-on:click
.
const MyDirective = resolveDirective('MyDirective') const nodeWithDirectives = withDirectives(h('div'), [ [MyDirective, 100, 'click'] ])
1
2
3
4[directive, value, arg, modifiers]
— Тоже, что и выше, плюс парыkey: value
типаObject
, определяющие любые модификаторы.
const MyDirective = resolveDirective('MyDirective') const nodeWithDirectives = withDirectives(h('div'), [ [MyDirective, 100, 'click', { prevent: true }] ])
1
2
3
4
# createRenderer
Функция createRenderer
принимает 2 общих аргумента: HostNode
и HostElement
, соответствующие типам Node
и Element
в окружении.
Например, для runtime-DOM, HostNode
будет интерфейсом DOM Node
, а HostElement
будет интерфейсом DOM Element
.
Пользовательские рендеры могут передавать платформо-специфичные типы следующим образом:
import { createRenderer } from 'vue'
const { render, createApp } = createRenderer<Node, Element>({
patchProp,
...nodeOps
})
2
3
4
5
# Аргументы
Принимает два аргумента: HostNode
и HostElement
# HostNode
Тип:
Node
Подробности:
Узел в окружении.
# HostElement
Тип:
Element
Подробности:
Элемент в окружении.
# nextTick
Возможность вызвать коллбэк, после следующего цикла обновления DOM. Используйте его сразу после изменения некоторых данных, чтобы дождаться обновлённого DOM.
import { createApp, nextTick } from 'vue'
const app = createApp({
setup() {
const message = ref('Привет!')
const changeMessage = async newMessage => {
message.value = newMessage
await nextTick()
console.log('Теперь DOM обновлён')
}
}
})
2
3
4
5
6
7
8
9
10
11
12
См. также: метод экземпляра $nextTick
# mergeProps
Объединяет в один несколько объектов входных параметров VNode. Возвращается новый объект — все передаваемые аргументами объекты останутся без изменений.
Передавать можно любое количество объектов, при этом приоритет будет у свойств идущих позднее. Обработчики событий, как и class
или style
, будут обработаны специальным образом: значения этих свойств объединяются, а не перезаписываются.
import { h, mergeProps } from 'vue'
export default {
inheritAttrs: false,
render() {
const props = mergeProps({
// Класс будет объединён с любым другим классом из $attrs
class: 'active'
}, this.$attrs)
return h('div', props)
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# useCssModule
Предупреждение
useCssModule
можно использовать только внутри функций render
или setup
.
Позволяет получить доступ к CSS-модулям в функции setup
однофайлового компонента:
<script>
import { h, useCssModule } from 'vue'
export default {
setup () {
const style = useCssModule()
return () => h('div', {
class: style.success
}, 'Задача выполнена!')
}
}
</script>
<style module>
.success {
color: #090;
}
</style>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Дополнительную информацию об использовании CSS-модулей можно изучить в разделе Vue Loader — CSS модули (opens new window).
# Аргументы
Принимает один аргумент: name
# name
Тип:
String
Подробности:
Имя CSS-модуля. По умолчанию
'$style'
.