API de la réactivité : Utilitaires
isRef()
Vérifie si une valeur est un objet ref.
Type :
tsfunction isRef<T>(r: Ref<T> | unknown): r is Ref<T>
Notez que le type retourné est un prédicat de type, ce qui signifie que
isRef
peut être utilisée comme un garde de type :tslet foo: unknown if (isRef(foo)) { // le type de foo est déduit à Ref<unknown> foo.value }
unref()
Retourne la valeur interne si l'argument est une ref, sinon retourne l'argument lui-même. C'est une fonction de sucre synthétique équivalente à val = isRef(val) ? val.value : val
.
Type :
tsfunction unref<T>(ref: T | Ref<T>): T
Exemple
tsfunction useFoo(x: number | Ref<number>) { const unwrapped = unref(x) // unwrapped sera désormais un nombre }
toRef()
Peut être utilisée pour normaliser les valeurs / refs / accesseurs en refs (3.3+).
Peut être utilisée pour créer une ref pour une propriété sur un objet source réactif. La ref créée est synchronisée avec sa propriété source : la mutation de la propriété source mettra à jour la ref, et vice-versa.
Type :
ts// signature de normalisation (3.3+) function toRef<T>( value: T ): T extends () => infer R ? Readonly<Ref<R>> : T extends Ref ? T : Ref<UnwrapRef<T>> // signature des propriétés de l'objet 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>
Exemple
Signature de normalisation (3.3+) :
js// retourne la ref existante telle quelle toRef(existingRef) // crée une ref en lecture seule qui appelle l'accesseur lors de l'accès à .value toRef(() => props.foo) // crée des refs classiques à partir de valeurs n'étant pas des fonctions // équivalent à ref(1) toRef(1)
Signature de la propriété de l'objet :
jsconst state = reactive({ foo: 1, bar: 2 }) // une ref bidirectionnelle qui se synchronise avec la propriété d'origine const fooRef = toRef(state, 'foo') // muter la ref met à jour l'original fooRef.value++ console.log(state.foo) // 2 // muter l'original met également à jour la ref state.foo++ console.log(fooRef.value) // 3
Notez que cela est différent de :
jsconst fooRef = ref(state.foo)
La ref ci-dessus n'est pas synchronisée avec
state.foo
, car la fonctionref()
reçoit une simple valeur numérique.toRef()
est utile quand vous voulez passer la ref d'une prop à une fonction composable :vue<script setup> import { toRef } from 'vue' const props = defineProps(/* ... */) // convertit `props.foo` en une ref, puis la passe // à un composable useSomeFeature(toRef(props, 'foo')) // syntaxe accesseur - recommandée en 3.3+ useSomeFeature(toRef(() => props.foo)) </script>
Lorsque
toRef
est utilisée avec des props de composant, les restrictions classiques concernant la modification des props s'appliquent. Tenter d'assigner une nouvelle valeur à la ref équivaut à essayer de modifier directement la prop et n'est pas autorisé. Dans ce cas, vous pouvez envisager d'utilisercomputed
avecget
etset
à la place. Consultez le guide expliquant comment utiliserv-model
avec les composants pour plus d'informations.En utilisant la signature des propriétés d'objets,
toRef()
retournera une ref utilisable même si la propriété source n'existe pas actuellement. Cela permet de travailler avec des propriétés optionnelles qui ne seraient pas prises en compte partoRefs
.
toValue()
Normalise les valeurs / refs / accesseurs en valeurs. Cela est similaire à unref(), sauf que cela normalise aussi les accesseurs. Si l'argument est un accesseur, il sera invoqué et sa valeur de retour sera renvoyée.
Cette fonction peut être utilisée dans les Composables pour normaliser un argument qui peut être soit une valeur, soit une ref, soit un accesseur.
Type :
tsfunction toValue<T>(source: T | Ref<T> | (() => T)): T
Exemple
jstoValue(1) // --> 1 toValue(ref(1)) // --> 1 toValue(() => 1) // --> 1
Normalisation des arguments dans les composables :
tsimport type { MaybeRefOrGetter } from 'vue' function useFeature(id: MaybeRefOrGetter<number>) { watch(() => toValue(id), id => { // réagit aux changements d'id }) } // ce composable supporte ces fonctions : useFeature(1) useFeature(ref(1)) useFeature(() => 1)
toRefs()
Convertit un objet réactif en un objet simple où chaque propriété de l'objet résultant est une ref pointant vers la propriété correspondante de l'objet original. Chaque ref individuelle est créée en utilisant toRef()
.
Type :
tsfunction toRefs<T extends object>( object: T ): { [K in keyof T]: ToRef<T[K]> } type ToRef = T extends Ref ? T : Ref<T>
Exemple
jsconst state = reactive({ foo: 1, bar: 2 }) const stateAsRefs = toRefs(state) /* Type de stateAsRefs: { foo: Ref<number>, bar: Ref<number> } */ // La ref et la propriété originale sont "liée" state.foo++ console.log(stateAsRefs.foo.value) // 2 stateAsRefs.foo.value++ console.log(state.foo) // 3
toRefs
est utile pour retourner un objet réactif à partir d'une fonction composable afin que le composant consommateur puisse déstructurer / répartir l'objet renvoyé sans perdre sa réactivité :jsfunction useFeatureX() { const state = reactive({ foo: 1, bar: 2 }) // ...opération logique sur l'état // conversion en refs lors du retour return toRefs(state) } // destructuration possible sans perte de réactivité const { foo, bar } = useFeatureX()
toRefs
ne générera des refs que pour les propriétés qui sont énumérables sur l'objet source au moment de l'appel. Pour créer une ref pour une propriété qui n'existe peut-être pas encore, utilisez plutôttoRef
.
isProxy()
Vérifie si un objet est un proxy créé par reactive()
, readonly()
, shallowReactive()
ou shallowReadonly()
.
Type :
tsfunction isProxy(value: unknown): boolean
isReactive()
Vérifie si un objet est un proxy créé par reactive()
ou shallowReactive()
.
Type :
tsfunction isReactive(value: unknown): boolean
isReadonly()
Vérifie si la valeur passée est un objet en lecture seule. Les propriétés d'un objet en lecture seule peuvent varier, mais elles ne peuvent pas être assignées directement via l'objet passé.
Les proxys créés par readonly()
et [shallowReadonly()
(./reactivity-advanced#shallowreadonly) sont tous deux considérés comme en lecture seule, tout comme une ref computed()
sans fonction set
.
Type :
tsfunction isReadonly(value: unknown): boolean