Options: State
data
Funkcja zwracająca początkowy stan reaktywny instancji komponentu.
Typ
tsinterface ComponentOptions { data?( this: ComponentPublicInstance, vm: ComponentPublicInstance ): object }
Szczegóły
Oczekuje się, że funkcja zwróci zwykły obiekt JavaScript, który zostanie uczyniony reaktywnym przez Vue. Po utworzeniu instancji, do reaktywnego obiektu danych można uzyskać dostęp jako
this.$data
. Instancja komponentu również przekazuje wszystkie właściwości znalezione w obiekcie danych, więcthis.a
będzie równoważne zthis.$data.a
.Wszystkie właściwości danych najwyższego poziomu muszą być zawarte w zwróconym obiekcie danych. Dodawanie nowych właściwości do
this.$data
jest możliwe, ale nie jest zalecane. Jeśli pożądana wartość właściwości nie jest jeszcze dostępna, należy uwzględnić pustą wartość, taką jakundefined
lubnull
, jako symbol zastępczy, aby Vue wiedziało, że właściwość istnieje.Właściwości, które zaczynają się od
_
lub$
NIE będą przekazywane jako proxy w instancji komponentu, ponieważ mogą kolidować z wewnętrznymi właściwościami i metodami API Vue. Będziesz musiał uzyskać do nich dostęp jakothis.$data._property
.Nie zaleca się zwracania obiektów z własnym zachowaniem stanowym, takich jak obiekty API przeglądarki i właściwości prototypu. Zwrócony obiekt powinien idealnie być zwykłym obiektem, który reprezentuje tylko stan komponentu.
Przykład
jsexport default { data() { return { a: 1 } }, created() { console.log(this.a) // 1 console.log(this.$data) // { a: 1 } } }
Zauważ, że jeśli użyjesz funkcji strzełkowej z właściwością
data
,this
nie będzie instancją komponentu, ale nadal możesz uzyskać dostęp do instancji jako pierwszego argumentu funkcji:jsdata: (vm) => ({ a: vm.myProp })
Zobacz także Reaktywność w głębi
props
Deklaruje właściwości komponentu.
Typ
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, rawProps: object) => boolean } type PropType<T> = { new (): T } | { new (): T }[]
Types are simplified for readability.
Szczegóły
W Vue wszystkie rekwizyty komponentów muszą być jawnie zadeklarowane. Rekwizyty komponentów mogą być deklarowane w dwóch formach:
- Prosta forma wykorzystująca tablicę ciągów znaków
- Pełna forma przy użyciu obiektu, w którym każdy klucz właściwości jest nazwą właściwości, a wartością jest typ właściwości (funkcja konstruktora) lub opcje zaawansowane.
W przypadku składni obiektowej, każda właściwość może dodatkowo definiować następujące opcje:
type
: Może być jednym z następujących natywnych konstruktorów:String
,Number
,Boolean
,Array
,Object
,Date
,Function
,Symbol
, dowolna niestandardowa funkcja konstruktora lub ich tablica. W trybie deweloperskim Vue sprawdzi, czy wartość właściwości jest zgodna z zadeklarowanym typem i wyświetli ostrzeżenie, jeśli tak nie jest. Więcej szczegółów można znaleźć w Prop Validation.Należy również pamiętać, że właściwość z typem
Boolean
wpływa na zachowanie rzutowania wartości zarówno w fazie rozwoju, jak i produkcji. Zobacz Boolean Casting po więcej szczegółów.default
: Określa domyślną wartość dla właściwości, gdy nie została ona przekazana przez rodzica lub ma wartośćundefined
. Domyślne wartości obiektu lub tablicy muszą zostać zwrócone przy użyciu funkcji fabryki. Funkcja fabryki otrzymuje również nieprzetworzony obiekt props jako argument.required
: Określa, czy rekwizyt jest wymagany. W środowisku nieprodukcyjnym zostanie wyświetlone ostrzeżenie konsoli, jeśli ta wartość jest prawdziwa, a właściwość nie zostanie przekazana.validator
: Niestandardowa funkcja walidatora, która przyjmuje wartość właściwości jako jedyny argument. W trybie deweloperskim zostanie wyświetlone ostrzeżenie konsoli, jeśli ta funkcja zwróci fałszywą wartość (tj. walidacja nie powiedzie się).
Przykład
Prosta deklaracja:
jsexport default { props: ['size', 'myMessage'] }
Deklaracja obiektu z walidacją:
jsexport default { props: { // kontrola typu height: Number, // kontrola typu z walidacją age: { type: Number, default: 0, required: true, validator: (value) => { return value >= 0 } } } }
Zobacz również
computed
Deklaruje obliczone właściwości, które mają być dostępne w instancji komponentu.
Typ
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> }
Szczegóły
Opcja akceptuje obiekt, gdzie kluczem jest nazwa obliczanej właściwości, a wartością jest albo obliczany getter, albo obiekt z metodami
get
iset
(dla zapisywalnych obliczanych właściwości).Wszystkie gettery i settery mają swój kontekst
this
automatycznie powiązany z instancją komponentu.Zauważ, że jeśli użyjesz funkcji strzałkowej z obliczoną właściwością,
this
nie będzie wskazywać na instancję komponentu, ale nadal możesz uzyskać dostęp do instancji jako pierwszego argumentu funkcji:jsexport default { computed: { aDouble: (vm) => vm.a * 2 } }
Przykład
jsexport default { data() { return { a: 1 } }, computed: { // tylko do odczytu aDouble() { return this.a * 2 }, // z możliwością nadpisania 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 } }
Zobacz również
methods
Deklaruje metody, które mają być mieszane z instancją komponentu.
Typ
tsinterface ComponentOptions { methods?: { [key: string]: (this: ComponentPublicInstance, ...args: any[]) => any } }
Szczegóły
Zadeklarowane metody mogą być bezpośrednio dostępne w instancji komponentu lub użyte w wyrażeniach szablonu. Wszystkie metody mają swój kontekst
this
automatycznie powiązany z instancją komponentu, nawet gdy jest on przekazywany.Unikaj używania funkcji strzałkowych podczas deklarowania metod, ponieważ nie będą one miały dostępu do instancji komponentu poprzez
this
.Przykład
jsexport default { data() { return { a: 1 } }, methods: { plus() { this.a++ } }, created() { this.plus() console.log(this.a) // => 2 } }
Zobacz również Event Handling
watch
Deklaruje wywołania zwrotne zegarka, które będą wywoływane przy zmianie danych.
Typ
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 // default: false deep?: boolean // default: false flush?: 'pre' | 'post' | 'sync' // default: 'pre' onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void }
Types are simplified for readability.
Szczegóły
Opcja
watch
oczekuje obiektu, w którym klucze są właściwościami instancji komponentu reaktywnego do obserwowania (np. właściwości zadeklarowane przezdata
lubcomputed
) - a wartości są odpowiednimi wywołaniami zwrotnymi. Wywołanie zwrotne otrzymuje nową wartość i starą wartość obserwowanego źródła.Oprócz właściwości na poziomie korzenia, kluczem może być również prosta ścieżka rozdzielana kropkami, np.
a.b.c
. Zauważ, że to użycie nie obsługuje złożonych wyrażeń - obsługiwane są tylko ścieżki rozdzielane kropkami. Jeśli potrzebujesz obserwować złożone źródła danych, użyj zamiast tego imperatywnego API$watch()
.Wartość może być również ciągiem nazwy metody (zadeklarowanym przez
methods
) lub obiektem zawierającym dodatkowe opcje. Gdy używana jest składnia obiektowa, wywołanie zwrotne powinno być zadeklarowane w poluhandler
. Dodatkowe opcje obejmują:immediate
: wyzwala wywołanie zwrotne natychmiast po utworzeniu obserwatora. Stara wartość będzieundefined
przy pierwszym wywołaniu.deep
: wymusza głębokie przeszukiwanie źródła, jeśli jest to obiekt lub tablica, tak aby wywołanie zwrotne było uruchamiane przy głębokich mutacjach. Zobacz Deep Watchers.flush
: dostosowanie czasu spłukiwania wywołania zwrotnego. Zobacz Callback Flush Timing iwatchEffect()
.onTrack / onTrigger
: debugowanie zależności watchera. Zobacz Watcher Debugging.
Unikaj używania funkcji strzałek podczas deklarowania wywołań zwrotnych watch, ponieważ nie będą one miały dostępu do instancji komponentu za pośrednictwem
this
.Przykład
jsexport default { data() { return { a: 1, b: 2, c: { d: 4 }, e: 5, f: 6 } }, watch: { // obserwowanie właściwości najwyższego poziomu a(val, oldVal) { console.log(`new: ${val}, old: ${oldVal}`) }, // nazwa metody b: 'someMethod', // wywołanie zwrotne będzie wywoływane za każdym razem, gdy którakolwiek z właściwości obserwowanego obiektu ulegnie zmianie, niezależnie od głębokości zagnieżdżenia. c: { handler(val, oldVal) { console.log('c changed') }, deep: true }, // obserwowanie pojedyńczą zagnieżdżoną właściwość: 'c.d': function (val, oldVal) { // kod który będzie wywołany }, // wywołanie zwrotne zostanie wywołane natychmiast po rozpoczęciu obserwacji e: { handler(val, oldVal) { console.log('e changed') }, immediate: true }, // możesz przekazać tablicę wywołań zwrotnych, będą one wywoływane jeden po drugim 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 // => new: 3, old: 1 } }
Zobacz również Watchers
emits
Deklaruje niestandardowe zdarzenia emitowane przez komponent.
Typ
tsinterface ComponentOptions { emits?: ArrayEmitsOptions | ObjectEmitsOptions } type ArrayEmitsOptions = string[] type ObjectEmitsOptions = { [key: string]: EmitValidator | null } type EmitValidator = (...args: unknown[]) => boolean
Szczegóły
Emitowane zdarzenia mogą być deklarowane w dwóch formach:
- Prosta forma wykorzystująca tablicę ciągów znaków
- Pełna forma przy użyciu obiektu, gdzie każdy klucz właściwości jest nazwą zdarzenia, a wartością jest
null
lub funkcja walidatora.
Funkcja walidacji otrzyma dodatkowe argumenty przekazane do wywołania
$emit
komponentu. Na przykład, jeśli wywoływane jestthis.$emit('foo', 1)
, odpowiedni walidator dlafoo
otrzyma argument1
. Funkcja walidatora powinna zwracać wartość logiczną, aby wskazać, czy argumenty zdarzenia są prawidłowe.Zauważ, że opcja
emits
wpływa na to, które detektory zdarzeń są uważane za detektory zdarzeń komponentu, a nie natywne detektory zdarzeń DOM. Nasłuchiwacze zadeklarowanych zdarzeń zostaną usunięte z obiektu$attrs
komponentu, więc nie zostaną przekazane do głównego elementu komponentu. Zobacz Fallthrough Attributes po więcej szczegółów.Przykład
Składnia tablicy:
jsexport default { emits: ['check'], created() { this.$emit('check') } }
Składnia obiektu:
jsexport default { emits: { // bez walidacji click: null, // z walidacją submit: (payload) => { if (payload.email && payload.password) { return true } else { console.warn(`Invalid submit event payload!`) return false } } } }
Zobacz również
expose
Deklaruje ujawnione właściwości publiczne, gdy instancja komponentu jest dostępna dla rodzica za pośrednictwem odwołań szablonu.
Typ
tsinterface ComponentOptions { expose?: string[] }
Szczegóły
Domyślnie instancja komponentu udostępnia wszystkie właściwości instancji rodzicowi, gdy dostęp do nich uzyskuje się za pośrednictwem
$parent
,$root
lub referencji szablonu. Może to być niepożądane, ponieważ komponent najprawdopodobniej ma wewnętrzny stan lub metody, które powinny pozostać prywatne, aby uniknąć ścisłego sprzężenia.Opcja
expose
oczekuje listy łańcuchów nazw właściwości. Gdy używana jest opcjaexpose
, tylko właściwości wyraźnie wymienione na liście zostaną ujawnione w publicznej instancji komponentu.Opcja
expose
wpływa tylko na właściwości zdefiniowane przez użytkownika - nie odfiltrowuje wbudowanych właściwości instancji komponentu.Przykład
jsexport default { // tylko `publicMethod` będzie dostępna w instancji publicznej expose: ['publicMethod'], methods: { publicMethod() { // ... }, privateMethod() { // ... } } }