# 監視関数は、特定の値の変化を監視するために使用され、値が変化すると、対応する処理ロジックがトリガーされます。
<template> <div> <div>{{ count }}</div> <button @click="changCount">更改count的值</button> </div> </template> <script setup> import {ref,reactive, watch} from 'vue' const count = ref(0) function changCount(){ count.value++ } watch(count,(newValue,oldValue)=>{ if(newValue){ console.log(`我侦听到了count状态的变化,当前值为${newValue},从而处理相关逻辑`); } }) </script> <style> </style>
<template> <div> <div>{{ x }}</div> <button @click="changCount">更改count的值</button> </div> </template> <script setup> import { ref, reactive, watch } from "vue"; const x = ref(1); const y = ref(5); function changCount() { x.value++; } watch( () => x.value + y.value, (sum) => { console.log(`我是x与y之和${sum}`); } ); </script> <style> </style>
<template> <div> <div>{{ x }}</div> <button @click="changCount">更改count的值</button> </div> </template> <script setup> import { ref, reactive, watch } from "vue"; const x = ref(1); const y = ref(5); function changCount() { x.value++; } watch( [x,y], ([x,y]) => { console.log(`我是x=>${x},我是y=》${y}`); } ); </script> <style> </style>
<template> <div> <div>{{ obj.name }}</div> <button @click="changObj">更改count的值</button> </div> </template> <script setup> import { ref, reactive, watch } from "vue"; const obj = ref({name:'你好'}) function changObj(){ obj.value.name+='我不好' } watch(()=>obj.value.name,(name)=>{ console.log(name); }) </script> <style> </style>
は、詳細な監視を有効にするために使用されます
<template> <div> <div>{{ obj.name }}</div> <button @click="changObj">更改count的值</button> </div> </template> <script setup> import { ref, reactive, watch, watchEffect } from "vue"; const obj = ref({name:'你好'}) function changObj(){ obj.value.name+='我不好' } // obj是一个RefImpl对象,当不开启深度监听的时候,监听obj无法检测到obj属性的变化 watch(obj,()=>{ console.log(obj.value.name); }, { deep: true }) </script> <style> </style>
初期化検出を有効にするかどうか。デフォルトでは、値が変更された場合にのみリスナーのメソッドが実行されます。即時を有効にすると、初期化が 1 回実行されます。
<template> <div> <div>{{ obj.name }}</div> <button @click="changObj">更改count的值</button> </div> </template> <script setup> import { ref, reactive, watch, watchEffect } from "vue"; const obj = ref({name:'你好'}) function changObj(){ obj.value.name+='我不好' } // obj是一个RefImpl对象,当不开启深度监听的时候,监听obj无法检测到obj属性的变化 watch(obj,()=>{ console.log(obj.value.name); }, { deep: true,immediate:true }) </script> <style> </style>
リスナー コールバックでは、ソースとまったく同じリアクティブ状態を使用するのが一般的です。例:
<template> <div> <div>{{ obj.name }}</div> <button @click="changObj">更改count的值</button> </div> </template> <script setup> import { ref, reactive, watch, watchEffect } from "vue"; const obj = ref({name:'你好'}) function changObj(){ obj.value.name+='我不好' } watch(obj.value,()=>{ console.log(obj.value.name); }) </script> <style> </style>
watchEffect 関数を使用して、上記のコードを簡素化できます。 watchEffect()
コールバックのリアクティブな依存関係を自動的に追跡できるようにします。上記のリスナーは次のように書き換えることができます:
<template> <div> <div>{{ obj.name }}</div> <button @click="changObj">更改count的值</button> </div> </template> <script setup> import { ref, reactive, watch, watchEffect } from "vue"; const obj = ref({name:'你好'}) function changObj(){ obj.value.name+='我不好' } // watch(obj.value,()=>{ // console.log(obj.value.name); // }) watchEffect(()=>{ console.log(obj.value.name); }) </script> <style> </style>
注: watchEffect コールバックはすぐに実行され、immediate
watch と watchEffect は両方とも、副作用を伴うコールバックを事後的に実行できます。これらの主な違いは、リアクティブな依存関係を追跡する方法です。
watch は、明示的にリッスンされるデータ ソースのみを追跡します。コールバックでアクセスされたものは追跡されません。さらに、コールバックはデータ ソースが実際に変更された場合にのみ起動されます。 watch は副作用が発生したときに依存関係の追跡を回避するため、コールバック関数がいつトリガーされるかをより正確に制御できます。
watchEffect は、副作用の発生中に依存関係を追跡します。同期中に、アクセス可能なすべてのリアクティブ プロパティが自動的に追跡されます。これはより便利で、コードがすっきりする傾向がありますが、リアクティブな依存関係が明確ではない場合があります。
リスナー コールバックで Vue によって更新された DOM にアクセスしたい場合は、flush: ' post を指定する必要があります。 ' オプション:
watch(source, callback, { flush: 'post' }) watchEffect(callback, { flush: 'post' })
Stop listen
setup() または