Options: Состояние
data
Функция, возвращающая начальное реактивное состояние для экземпляра компонента.
Тип
tsinterface ComponentOptions { data?( this: ComponentPublicInstance, vm: ComponentPublicInstance ): object }
Подробности
Ожидается, что функция вернет обычный объект JavaScript, который Vue сделает реактивным. После создания экземпляра к объекту реактивных данных можно получить доступ через
this.$data
. Экземпляр компонента также передает все свойства объекта данных, поэтомуthis.a
будет эквивалентенthis.$data.a
.Все свойства данных верхнего уровня должны быть включены в возвращаемый объект данных. Добавление новых свойств в
this.$data
возможно, но не рекомендуется. Если нужное значение свойства ещё недоступно, то в качестве заполнителя следует включить пустое значение, напримерundefined
илиnull
, чтобы Vue знал о существовании свойства.Свойства, начинающиеся с
_
или$
, не будут проксироваться на экземпляр компонента, поскольку они могут конфликтовать с внутренними свойствами и методами API Vue. Вам придется обращаться к ним черезthis.$data._property
.Не рекомендуется возвращать объекты с собственным поведением в состоянии, например, объекты API браузера и свойства прототипов. В идеале возвращаемый объект должен быть простым объектом, который представляет только состояние компонента.
Пример
jsexport default { data() { return { a: 1 } }, created() { console.log(this.a) // 1 console.log(this.$data) // { a: 1 } } }
Обратите внимание, что если вы используете стрелочную функцию со свойством
data
,this
не будет экземпляром компонента, но вы всё равно сможете получить доступ к экземпляру в качестве первого аргумента функции:jsdata: (vm) => ({ a: vm.myProp })
Смотрите также Реактивность в деталях
props
Объявление параметров компонента.
Тип
tsinterface ComponentOptions { props?: ArrayPropsOptions | ObjectPropsOptions } type ArrayPropsOptions = string[] type ObjectPropsOptions = { [key: string]: Prop } type Prop<T = any> = PropOptions<T> | PropType<T> | null interface PropOptions<T> { type?: PropType<T> required?: boolean default?: T | ((rawProps: object) => T) validator?: (value: unknown) => boolean } type PropType<T> = { new (): T } | { new (): T }[]
Типы упрощены для удобства чтения.
Подробности
В Vue все параметры компонентов должны быть явно объявлены. Это можно сделать в двух формах:
- Простая форма с использованием массива строк.
- Полная форма с использованием объекта, где каждое свойство-ключ — это имя параметра, а значение — тип параметра (функция-конструктор) или дополнительные опции.
С помощью объектно-ориентированного синтаксиса каждый параметр может дополнительно определять следующие параметры:
type
: Может быть одним из следующих собственных конструкторов:String
,Number
,Boolean
,Array
,Object
,Date
,Function
,Symbol
, любая пользовательская функция-конструктор или их массив. В режиме разработки Vue проверит, соответствует ли значение параметра объявленному типу, и выдаст предупреждение, если это не так. Более подробную информацию см. в разделе Валидация пропсов.Также обратите внимание, что параметр с типом
Boolean
влияет на поведение приведения значений как в разработке, так и в продакшене. Подробнее см. в разделе Приведение к булевому типу.default
: Определяет значение по умолчанию для свойства, если оно не передано родителем или имеет значениеundefined
. Объект или массив по умолчанию должны быть возвращены с помощью фабричной функции. Функция фабрики также получает в качестве аргумента необработанный объект параметра.required
: Определяет, требуется ли параметр. В непродакшен-среде будет выдано консольное предупреждение, если это значение истинно, а параметр не передан.validator
: Пользовательская функция-валидатор принимает значение пропа и объект всех пропсов в качестве аргументов. В режиме разработки, если эта функция возвращает ложное значение (т. е. валидация не проходит), Vue выдаст предупреждение в консоли.
Пример
Простая декларация:
jsexport default { props: ['size', 'myMessage'] }
Объявление объекта с валидацией:
jsexport default { props: { // проверка типа height: Number, // проверка типа плюс другие проверки age: { type: Number, default: 0, required: true, validator: (value) => { return value >= 0 } } } }
Смотрите также
computed
Объявляем вычисляемые свойства, которые должны быть открыты для экземпляра компонента.
Тип
tsinterface ComponentOptions { computed?: { [key: string]: ComputedGetter<any> | WritableComputedOptions<any> } } type ComputedGetter<T> = ( this: ComponentPublicInstance, vm: ComponentPublicInstance ) => T type ComputedSetter<T> = ( this: ComponentPublicInstance, value: T ) => void type WritableComputedOptions<T> = { get: ComputedGetter<T> set: ComputedSetter<T> }
Подробности
Опция принимает объект, где ключ — это имя вычисляемого свойства, а значение — либо вычисляемый геттер, либо объект с методами
get
иset
(для вычисляемых свойств с возможностью записи).Все геттеры и сеттеры имеют контекст
this
, автоматически привязанный к экземпляру компонента.Обратите внимание, что если вы используете стрелочную функцию с вычисляемым свойством,
this
не будет указывать на экземпляр компонента, но вы всё равно сможете получить доступ к нему в качестве первого аргумента функции:jsexport default { computed: { aDouble: (vm) => vm.a * 2 } }
Пример
jsexport default { data() { return { a: 1 } }, computed: { // readonly aDouble() { return this.a * 2 }, // writable aPlus: { get() { return this.a + 1 }, set(v) { this.a = v - 1 } } }, created() { console.log(this.aDouble) // => 2 console.log(this.aPlus) // => 2 this.aPlus = 3 console.log(this.a) // => 2 console.log(this.aDouble) // => 4 } }
Смотрите также
methods
Объявляем методы, которые будут смешиваться с экземпляром компонента.
Тип
tsinterface ComponentOptions { methods?: { [key: string]: (this: ComponentPublicInstance, ...args: any[]) => any } }
Подробности
К объявленным методам можно обращаться непосредственно к экземпляру компонента или использовать их в шаблонных выражениях. Все методы автоматически привязывают свой контекст
this
к экземпляру компонента, даже если он передается по кругу.Избегайте использования стрелочных функций при объявлении методов, так как они не будут иметь доступа к экземпляру компонента через
this
.Пример
jsexport default { data() { return { a: 1 } }, methods: { plus() { this.a++ } }, created() { this.plus() console.log(this.a) // => 2 } }
Смотрите также Обработка событий
watch
Объявляем обратные вызовы watch, которые будут вызываться при изменении данных.
Тип
tsinterface ComponentOptions { watch?: { [key: string]: WatchOptionItem | WatchOptionItem[] } } type WatchOptionItem = string | WatchCallback | ObjectWatchOptionItem type WatchCallback<T> = ( value: T, oldValue: T, onCleanup: (cleanupFn: () => void) => void ) => void type ObjectWatchOptionItem = { handler: WatchCallback | string immediate?: boolean // по умолчанию: false deep?: boolean // по умолчанию: false flush?: 'pre' | 'post' | 'sync' // по умолчанию: 'pre' onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void }
Типы упрощены для удобства чтения.
Подробности
Опция
watch
ожидает объект, в котором ключами являются свойства экземпляра реактивного компонента, за которыми нужно следить (например, свойства, объявленные черезdata
илиcomputed
) — а values — это соответствующие обратные вызовы. Обратный вызов получает новое значение и старое значение наблюдаемого источника.Помимо свойства корневого уровня, ключом может быть простой путь, разделённый точками, например
a.b.c
. Обратите внимание, что это использование не поддерживает сложные выражения — поддерживаются только пути, разделённые точками. Если вам нужно следить за сложными источниками данных, используйте вместо этого императивный API$watch()
.Значение также может быть строкой имени метода (объявленного через
methods
) или объектом, содержащим дополнительные опции. При использовании объектного синтаксиса обратный вызов должен быть объявлен в полеhandler
. Дополнительные опции включают:immediate
: запускаем обратный вызов непосредственно при создании наблюдателя. При первом вызове старое значение будетundefined
.deep
: принудительный глубокий обход источника, если он является объектом или массивом, чтобы обратный вызов срабатывал при глубоких мутациях. Смотрите Глубокие наблюдатели.flush
: настройка времени обратного вызова для сброса. Смотрите Время сброса обратного вызова иwatchEffect()
.onTrack / onTrigger
: отладка зависимостей наблюдателя. Смотрите Отладка наблюдателей.
Избегайте использования стрелочных функций при объявлении обратных вызовов watch, так как они не будут иметь доступа к экземпляру компонента через
this
.Пример
jsexport default { data() { return { a: 1, b: 2, c: { d: 4 }, e: 5, f: 6 } }, watch: { // наблюдение за свойством верхнего уровня a(val, oldVal) { console.log(`new: ${val}, old: ${oldVal}`) }, // строковое имя метода b: 'someMethod', // обратный вызов будет вызываться каждый раз, когда любое из наблюдаемых свойств объекта изменится, независимо от глубины вложенности c: { handler(val, oldVal) { console.log('c changed') }, deep: true }, // наблюдение за одним вложенным свойством: 'c.d': function (val, oldVal) { // делаем что-то }, // обратный вызов будет вызван сразу после начала наблюдения e: { handler(val, oldVal) { console.log('e changed') }, immediate: true }, // вы можете передать массив обратных вызовов, они будут вызываться по очереди f: [ 'handle1', function handle2(val, oldVal) { console.log('handle2 triggered') }, { handler: function handle3(val, oldVal) { console.log('handle3 triggered') } /* ... */ } ] }, methods: { someMethod() { console.log('b changed') }, handle1() { console.log('handle 1 triggered') } }, created() { this.a = 3 // => новое значение: 3, старое значение: 1 } }
Смотрите также Наблюдатели
emits
Объявляем пользовательские события, испускаемые компонентом.
Тип
tsinterface ComponentOptions { emits?: ArrayEmitsOptions | ObjectEmitsOptions } type ArrayEmitsOptions = string[] type ObjectEmitsOptions = { [key: string]: EmitValidator | null } type EmitValidator = (...args: unknown[]) => boolean
Подробности
Испускаемые события могут быть объявлены в двух формах:
- Простая форма с использованием массива строк.
- Полная форма с использованием объекта, где каждое свойство-ключ — это имя события, а значение — либо
null
, либо функция валидатора.
Функция проверки получит дополнительные аргументы, переданные в вызов компонента
$emit
. Например, если вызватьthis.$emit('foo', 1)
, то соответствующий валидатор дляfoo
получит аргумент1
. Функция валидатора должна возвращать логическое значение, указывающее на то, являются ли аргументы события действительными.Обратите внимание, что опция
emits
влияет на то, какие слушатели событий будут считаться слушателями событий компонента, а не собственными слушателями событий DOM. Слушатели объявленных событий будут удалены из объекта$attrs
компонента, поэтому они не будут передаваться в корневой элемент компонента. Дополнительные сведения см. в главе Передаваемые атрибуты.Пример
Синтаксис массива:
jsexport default { emits: ['check'], created() { this.$emit('check') } }
Синтаксис объекта:
jsexport default { emits: { // без валидации click: null, // с валидацией submit: (payload) => { if (payload.email && payload.password) { return true } else { console.warn(`Неверная полезная нагрузка события submit!`) return false } } } }
Смотрите также
expose
Объявляйте открытые публичные свойства, когда к экземпляру компонента обращается родитель через ссылки на элементы шаблона.
Тип
tsinterface ComponentOptions { expose?: string[] }
Подробности
По умолчанию экземпляр компонента раскрывает все свойства экземпляра родителю при обращении к нему через
$parent
,$root
или ссылки на элементы шаблона. Это может быть нежелательно, поскольку компонент, скорее всего, имеет внутреннее состояние или методы, которые должны быть приватными, чтобы избежать тесной связи.Опция
expose
ожидает список строк с именами свойств. Когда используетсяexpose
, только свойства, явно перечисленные в списке, будут открыты для публичного экземпляра компонента.expose
действует только на пользовательские свойства — он не отфильтровывает встроенные свойства экземпляров компонентов.Пример
jsexport default { // только `publicMethod` будет доступен для публичного экземпляра expose: ['publicMethod'], methods: { publicMethod() { // ... }, privateMethod() { // ... } } }