Reactivity API: Utilities
isRef()
Verifica se un valore è un oggetto ref.
Tipo
tsfunction isRef<T>(r: Ref<T> | unknown): r is Ref<T>
Nota: il tipo di ritorno è un type predicate, il che significa che
isRef
può essere utilizzato come type guard:tslet foo: unknown if (isRef(foo)) { // il tipo di foo è ora limitato a Ref<unknown> foo.value }
unref()
Restituisce il valore interno se l'argomento è un ref, altrimenti restituisce l'argomento stesso. Questa è una funzione di "zucchero sintattico" equivalente a val = isRef(val) ? val.value : val
.
Tipo
tsfunction unref<T>(ref: T | Ref<T>): T
Esempio
tsfunction useFoo(x: number | Ref<number>) { const unwrapped = unref(x) // unwrapped è certo che sia ora un numero }
toRef()
Può essere utilizzato per normalizzare value / ref / getter nei ref (3.3+).
Può anche essere utilizzato per creare un ref per una proprietà su un oggetto reattivo sorgente. Il ref creato è sincronizzato con la proprietà di origine: la modifica della proprietà di origine aggiornerà il ref e viceversa.
Tipo
ts// firma di normalizzazione (3.3+) function toRef<T>( value: T ): T extends () => infer R ? Readonly<Ref<R>> : T extends Ref ? T : Ref<UnwrapRef<T>> // firma della proprietà dell'oggetto function toRef<T extends object, K extends keyof T>( object: T, key: K, defaultValue?: T[K] ): ToRef<T[K]> type ToRef<T> = T extends Ref ? T : Ref<T>
Esempio
Firma di normalizzazione (3.3+):
js// restituisce i ref esistenti così come sono toRef(existingRef) // crea un ref in sola lettura che chiama il getter su accesso a .value toRef(() => props.foo) // crea ref normali da valori non funzione // equivalente a ref(1) toRef(1)
Firma della proprietà dell'oggetto:
jsconst state = reactive({ foo: 1, bar: 2 }) // un ref bidirezionale che si sincronizza con la proprietà originale const fooRef = toRef(state, 'foo') // la modifica del ref aggiorna l'originale fooRef.value++ console.log(state.foo) // 2 // la modifica dell'originale aggiorna anche il ref state.foo++ console.log(fooRef.value) // 3
Nota che ciò è diverso da:
jsconst fooRef = ref(state.foo)
Il ref sopra non è sincronizzato con
state.foo
, perchèref()
riceve un valore numerico semplice.toRef()
è utile quando si desidera passare il ref di una prop a una funzione composable:vue<script setup> import { toRef } from 'vue' const props = defineProps(/* ... */) // converti `props.foo` in un ref, poi passalo a // una funzione componibile useSomeFeature(toRef(props, 'foo')) // sintassi getter - consigliata in 3.3+ useSomeFeature(toRef(() => props.foo)) </script>
Quando
toRef
viene utilizzato con le prop del componente, si applicano comunque le solite restrizioni sulla modifica delle prop. Tentare di assegnare un nuovo valore al ref è equivalente a cercare di modificare direttamente la prop e non è consentito. In questo scenario potrebbe essere utile considerare l'uso dicomputed
conget
eset
al loro posto. Consulta la guida su usarev-model
con i componenti per maggiori informazioni.Quando viene utilizzata la firma della proprietà dell'oggetto,
toRef()
restituirà un ref utilizzabile anche se la proprietà di origine non esiste attualmente. Ciò consente di lavorare con proprietà opzionali, che non verrebbero rilevate datoRefs
.
toValue()
Normalizza valori / ref / getter in valori. Questo è simile a unref(), tranne che normalizza anche i getter. Se l'argomento è un getter, verrà invocato e il suo valore di ritorno verrà restituito.
Può essere utilizzato nei Composables per normalizzare un argomento che può essere un valore, un ref o un getter.
Tipo
tsfunction toValue<T>(source: T | Ref<T> | (() => T)): T
Esempio
jstoValue(1) // --> 1 toValue(ref(1)) // --> 1 toValue(() => 1) // --> 1
Normalizzazione degli argomenti nei composables:
tsimport type { MaybeRefOrGetter } from 'vue' function useFeature(id: MaybeRefOrGetter<number>) { watch(() => toValue(id), id => { // reagisce ai cambiamenti di id }) } // questo composable supporta uno qualsiasi dei seguenti: useFeature(1) useFeature(ref(1)) useFeature(() => 1)
toRefs()
Converte un oggetto reattivo in un oggetto semplice in cui ogni proprietà dell'oggetto risultante è un ref che punta alla corrispondente proprietà dell'oggetto originale. Ciascun ref individuale è creato utilizzando toRef()
.
Tipo
tsfunction toRefs<T extends object>( object: T ): { [K in keyof T]: ToRef<T[K]> } type ToRef = T extends Ref ? T : Ref<T>
Esempio
jsconst state = reactive({ foo: 1, bar: 2 }) const stateAsRefs = toRefs(state) /* Tipo di stateAsRefs: { foo: Ref<number>, bar: Ref<number> } */ // Il ref e la proprietà originale sono "collegati" state.foo++ console.log(stateAsRefs.foo.value) // 2 stateAsRefs.foo.value++ console.log(state.foo) // 3
toRefs
è utile quando si restituisce un oggetto reattivo da una funzione componibile in modo che il componente consumatore possa decostruire/spargere l'oggetto restituito senza perdere la reattività:jsfunction useFeatureX() { const state = reactive({ foo: 1, bar: 2 }) // ...logica che opera sullo state // converti in ref quando viene fatto il return return toRefs(state) } // può essere destrutturato senza perdere la reattività const { foo, bar } = useFeatureX()
toRefs
genererà refs solo per le proprietà che sono enumerabili sull'oggetto sorgente al momento della chiamata. Per creare un ref per una proprietà che potrebbe non ancora esistere, utilizzaretoRef
al suo posto.
isProxy()
Verifica se un oggetto è un proxy creato da reactive()
, readonly()
, shallowReactive()
o shallowReadonly()
.
Tipo
tsfunction isProxy(value: unknown): boolean
isReactive()
Verifica se un oggetto è un proxy creato da reactive()
o shallowReactive()
.
Tipo
tsfunction isReactive(value: unknown): boolean
isReadonly()
Verifica se il valore passato è un oggetto di sola lettura. Le proprietà di un oggetto di sola lettura possono cambiare, ma non possono essere assegnate direttamente tramite l'oggetto passato.
I proxy creati da readonly()
e shallowReadonly()
ono entrambi considerati di sola lettura, così come un ref computed()
ref senza la funzione set
.
Tipo
tsfunction isReadonly(value: unknown): boolean