API réactive : cœur
1. réf()
Prend une valeur interne et renvoie un objet ref réactif et modifiable avec une seule propriété pointant vers sa valeur interne .value
.
-
taper
function ref<T>(value: T): Ref<UnwrapRef<T>> interface Ref<T> { value: T }
-
détails
L'objet ref est modifiable, ce qui signifie que vous pouvez
.value
lui attribuer de nouvelles valeurs. Il est également réactif, c'est-à-dire que toutes.value
les opérations sur seront suivies et que les écritures déclencheront les effets secondaires qui leur sont associés.Si un objet est assigné à ref, alors cet objet sera converti en un objet avec une réactivité profonde via reactive() . Cela signifie également que si l'objet contient des références imbriquées, elles seront profondément déballées.
Pour éviter cette conversion profonde, utilisez
shallowRef()
plutôt. -
exemple
const count = ref(0) console.log(count.value) // 0 count.value++ console.log(count.value) // 1
Deux, réactif ()
Renvoie un proxy réactif pour un objet .
-
taper
function reactive<T extends object>(target: T): UnwrapNestedRefs<T>
-
détails
Une transformation réactive est « profonde » : elle affecte toutes les propriétés imbriquées. Un objet réactif déballera également en profondeur toutes les propriétés ref tout en restant réactif.
Il convient de noter que lors de l'accès à un élément ref dans un tableau réactif ou
Map
un tel type de collection natif, aucun déballage ref ne sera effectué.Pour éviter les transitions réactives profondes et ne vouloir préserver que la réactivité de l'accès de niveau supérieur à cet objet, utilisez à la place la fonction WishWoepReactive() .
L'objet renvoyé et ses objets imbriqués seront enveloppés par ES Proxy , il n'est donc pas égal à l'objet source. Il est recommandé de n'utiliser que des proxys réactifs et d'éviter d'utiliser des objets d'origine.
-
exemple
Créez un objet réactif :
const obj = reactive({ count: 0 }) obj.count++
Déballage de la réf :
const count = ref(1) const obj = reactive({ count }) // ref 会被解包 console.log(obj.count === count.value) // true // 会更新 `obj.count` count.value++ console.log(count.value) // 2 console.log(obj.count) // 2 // 也会更新 `count` ref obj.count++ console.log(obj.count) // 3 console.log(count.value) // 3
Notez que lors de l'accès à un élément ref dans un tableau réactif ou
Map
un type de collection natif, aucun déballage ref n'est effectué :const books = reactive([ref('Vue 3 Guide')]) // 这里需要 .value console.log(books[0].value) const map = reactive(new Map([['count', ref(0)]])) // 这里需要 .value console.log(map.get('count').value)
Lors de l'attribution d'une référence à une
reactive
propriété, la référence sera automatiquement déroulée :const count = ref(1) const obj = reactive({ }) obj.count = count console.log(obj.count) // 1 console.log(obj.count === count.value) // true
Trois, calculé ()
Prend une fonction getter et renvoie un objet ref réactif en lecture seule . La référence .value
expose la valeur de retour de la fonction getter via . Il peut également accepter un objet avec des fonctions get
et set
pour créer un objet ref accessible en écriture.
-
taper
// 只读 function computed<T>( getter: () => T, // 查看下方的 "计算属性调试" 链接 debuggerOptions?: DebuggerOptions ): Readonly<Ref<Readonly<T>>> // 可写的 function computed<T>( options: { get: () => T set: (value: T) => void }, debuggerOptions?: DebuggerOptions ): Ref<T>
-
exemple
Créez une référence de propriété calculée en lecture seule :
const count = ref(1) const plusOne = computed(() => count.value + 1) console.log(plusOne.value) // 2 plusOne.value++ // 错误
Créez une propriété calculée inscriptible ref :
const count = ref(1) const plusOne = computed({ get: () => count.value + 1, set: (val) => { count.value = val - 1 } }) plusOne.value = 1 console.log(count.value) // 0
débogage :
const plusOne = computed(() => count.value + 1, { onTrack(e) { debugger }, onTrigger(e) { debugger } })
4. lecture seule()
Prend un objet (qu'il soit réactif ou brut) ou une référence et renvoie un proxy en lecture seule de la valeur d'origine.
-
taper
function readonly<T extends object>( target: T ): DeepReadonly<UnwrapNestedRefs<T>>
-
détails
Les proxys en lecture seule sont profonds : l'accès à toutes les propriétés imbriquées sera en lecture seule. Son comportement de déballage ref est
reactive()
le même que , mais la valeur déballée est en lecture seule.Pour éviter un comportement de conversion en profondeur, utilisez à la place une fonction peu profondeReadonly() .
-
exemple
const original = reactive({ count: 0 }) const copy = readonly(original) watchEffect(() => { // 用来做响应性追踪 console.log(copy.count) }) // 更改源属性会触发其依赖的侦听器 original.count++ // 更改该只读副本将会失败,并会得到一个警告 copy.count++ // warning!
Cinq, watchEffet ()
Exécutez une fonction immédiatement tout en suivant de manière réactive ses dépendances et en les réexécutant lorsque les dépendances changent.
-
taper
function watchEffect( effect: (onCleanup: OnCleanup) => void, options?: WatchEffectOptions ): StopHandle type OnCleanup = (cleanupFn: () => void) => void interface WatchEffectOptions { flush?: 'pre' | 'post' | 'sync' // default: 'pre' onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void } type StopHandle = () => void
-
détails
Le premier argument est la fonction d'effet secondaire à exécuter. Le paramètre de cette fonction d'effet secondaire est également une fonction, qui est utilisée pour enregistrer le rappel de nettoyage. Le rappel de nettoyage sera appelé avant la prochaine exécution de l'effet secondaire et peut être utilisé pour nettoyer les effets secondaires non valides, tels que les demandes asynchrones en attente (voir l'exemple ci-dessous).
Le deuxième paramètre est une option facultative qui peut être utilisée pour ajuster la synchronisation de l'effet secondaire ou déboguer la dépendance de l'effet secondaire.
La valeur de retour est une fonction utilisée pour arrêter l'effet secondaire.
-
exemple
const count = ref(0) watchEffect(() => console.log(count.value)) // -> 输出 0 count.value++ // -> 输出 1
Effets secondaires éliminés :
watchEffect(async (onCleanup) => { const { response, cancel } = doAsyncWork(id.value) // `cancel` 会在 `id` 更改时调用 // 以便取消之前 // 未完成的请求 onCleanup(cancel) data.value = await response })
Arrêtez l'écouteur :
const stop = watchEffect(() => { }) // 当不再需要此侦听器时: stop()
choix :
watchEffect(() => { }, { flush: 'post', onTrack(e) { debugger }, onTrigger(e) { debugger } })
6. regarderPostEffet()
watchEffect()
flush: 'post'
Alias lors de l'utilisation de l'option.
七、watchSyncEffect()
watchEffect()
flush: 'sync'
Alias lors de l'utilisation de l'option.
Huit, regarde ()
Écoute une ou plusieurs sources de données réactives et appelle la fonction de rappel donnée lorsque la source de données change.
-
taper
// 侦听单个来源 function watch<T>( source: WatchSource<T>, callback: WatchCallback<T>, options?: WatchOptions ): StopHandle // 侦听多个来源 function watch<T>( sources: WatchSource<T>[], callback: WatchCallback<T[]>, options?: WatchOptions ): StopHandle type WatchCallback<T> = ( value: T, oldValue: T, onCleanup: (cleanupFn: () => void) => void ) => void type WatchSource<T> = | Ref<T> // ref | (() => T) // getter | T extends object ? T : never // 响应式对象 interface WatchOptions extends WatchEffectOptions { immediate?: boolean // 默认:false deep?: boolean // 默认:false flush?: 'pre' | 'post' | 'sync' // 默认:'pre' onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void }
Les types sont simplifiés pour plus de lisibilité.
-
détails
watch()
La valeur par défaut est l'écoute différée, c'est-à-dire que la fonction de rappel n'est exécutée que lorsque la source d'écoute change.Le premier paramètre est la source de l'écouteur . Cette source peut être l'une des suivantes :
- une fonction qui renvoie une valeur
- une réf
- un objet réactif
- ... ou un tableau de valeurs des types ci-dessus
Le deuxième paramètre est une fonction de rappel à appeler lorsqu'un changement se produit. Cette fonction de rappel prend trois arguments : la nouvelle valeur, l'ancienne valeur et une fonction de rappel pour enregistrer le nettoyage des effets secondaires. Cette fonction de rappel sera appelée avant que l'effet secondaire ne soit réexécuté la prochaine fois et peut être utilisée pour effacer les effets secondaires non valides, tels que les demandes asynchrones en attente.
Lors de l'écoute de plusieurs sources, la fonction de rappel accepte deux tableaux, un pour la nouvelle valeur et un pour l'ancienne valeur dans le tableau source.
Le troisième argument facultatif est un objet qui prend en charge les options suivantes :
immediate
: Le rappel est déclenché immédiatement lorsque l'écouteur est créé. L'ancienne valeur est lors du premier appelundefined
.deep
: si la source est un objet, force un parcours profond afin que les rappels soient déclenchés lors de changements de niveau profonds. Voir la section Écouteurs profonds .flush
: Ajustez la synchronisation de rafraîchissement de la fonction de rappel. Reportez-vous à la section sur la fréquence d'actualisation des rappels .onTrack / onTrigger
: Dépendance de l'écouteur de débogage. Voir la section sur le débogage des écouteurs .
watchEffect()
Par rapport àwatch()
nous permet de :- exécuter paresseusement les effets secondaires;
- Il est plus clair quel état doit déclencher la ré-exécution de l'écouteur ;
- Peut accéder aux valeurs précédentes et actuelles de l'état écouté.
-
exemple
Écoutez une fonction getter :
const state = reactive({ count: 0 }) watch( () => state.count, (count, prevCount) => { /* ... */ } )
Écoutez une réf :
const count = ref(0) watch(count, (count, prevCount) => { /* ... */ })
Lors de l'écoute de plusieurs sources, la fonction de rappel accepte deux tableaux, correspondant aux nouvelles et anciennes valeurs du tableau source :
watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => { /* ... */ })
Lors de l'utilisation d'une fonction getter comme source, le rappel ne se déclenche que lorsque la valeur de retour de la fonction change. Si vous voulez que le rappel se déclenche même lors de changements profonds, vous devez utiliser
{ deep: true }
forcer l'écouteur en mode profond. En mode profond, si la fonction de rappel est déclenchée en raison d'un changement profond, la nouvelle valeur et l'ancienne valeur seront le même objet.const state = reactive({ count: 0 }) watch( () => state, (newValue, oldValue) => { // newValue === oldValue }, { deep: true } )
Lors de l'écoute directe d'un objet réactif, l'écouteur active automatiquement le mode profond :
const state = reactive({ count: 0 }) watch(state, () => { /* 深层级变更状态所触发的回调 */ })
watch()
watchEffect()
Possède les mêmes options de synchronisation et de débogage d'actualisation que :watch(source, callback, { flush: 'post', onTrack(e) { debugger } })