返回列表 发布新帖
查看: 41|回复: 0

watch监听的使用

发表于 4 天前 | 查看全部 |阅读模式

这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 zzz 于 2025-9-4 16:28 编辑

watch是什么?
在vue3中,watch函数被重新设计为一个独立的API,用于观察数据变化并执行相应的操作。
watch 函数接受两个参数:
第一个:可以是一个函数或数组。如果是函数,则返回要监听的数据,当数据变化时会触发回调函数;如果是数组,则返回一个数组,包含要监听的多个数据,当任意一个数据变化时都会触发回调函数。
第二个:一个回调函数,用于处理数据变化时的操作。回调函数接收两个参数,第一个参数为新值,第二个参数为旧值。
有两个额外的参数:1.immediate(画面加载后立即执行),2.deep(深度侦听)。
例1:监听单个数据
  1. <template>
  2.     <h1>数量变化:{{ count }}</h1>
  3.     <a-button @click="addcount">++count</a-button>
  4. </template>
  5. <script setup>
  6. // 声明变量count
  7. const count=ref(0)
  8. // count触发方法
  9. const addcount=()=>{
  10.     count.value++
  11. }
  12. // 触发监听器---单个数据监听
  13. watch(count,(newValue,oldValue)=>{
  14.     console.log(`count变化,旧值:${oldValue},新值:${newValue}`);
  15. })
  16. </script>
复制代码
例2:监听单个数据
  1. <template>
  2.     <h1>数量变化:{{ name }}/{{ count }}</h1>
  3.     <a-button @click="handleChangeName">++count</a-button>
  4. </template>
  5. <script setup>
  6. // 声明变量count
  7. const name=ref('小明')
  8. const count=ref(0)
  9. // 触发方法
  10. const handleChangeName=()=>{
  11.     count.value++
  12.     name.value='小小明!!!'
  13. }
  14. // 触发监听器---多个数据监听
  15. watch([count,name],([newCount,newName],[oldCount,oldName])=>{
  16.     console.log(`count变化,旧值为:${oldCount},新值为:${newCount}`);
  17.     console.log(`name变化,旧值为:${oldName},新值为:${newName}`);
  18. })
  19. </script>

复制代码
例3:监听多个值的变化
  1. <template>
  2.     <a-form :model="form" label-width="120px">
  3.         <a-form-item label="价格">
  4.             <a-input v-model="form.price" />
  5.         </a-form-item>
  6.         <a-form-item label="数量">
  7.             <a-input v-model="form.count" />
  8.         </a-form-item>
  9.         <a-form-item label="总价">
  10.             <a-input v-model="form.total" />
  11.         </a-form-item>
  12.         <a-form-item>
  13.             <a-button @click="setForm">计算</a-button>
  14.         </a-form-item>
  15.     </a-form>
  16. </template>

  17. <script setup>
  18. const form = ref(
  19.     { price: '', count: '', total: '' }
  20. );

  21. const setForm = () => {
  22.     form.value = {
  23.         price: '24',
  24.         count: '400',
  25.         total: '9600'
  26.     }
  27. }

  28. // immediate:立刻执行,进入页面就执行一次,一般用于画面的初始化显示。
  29. watch(form, (newVal, oldVal) => {
  30.     console.log("进入页面执行了")
  31.     console.log("新值:" + newVal + ",旧值:" + oldVal);
  32. }, {
  33.     immediate: true
  34. })

  35. // deep:深度监视,如果要监听的响应式对象中有多个属性,默认是浅层监听。
  36. // 传入的响应式对象,如果是简单类型,可以直接监听,如果是复杂类型,监视不到复杂类型内部属性的变化,按照下面的示例,只有form.value重新设置了一个对象,监听才会触发
  37. // 只有对象的地址发生了变化,才会触发监听,设置deep为true时,对象及对象中的某个属性发生变化时,也可以监听到
  38. // 如果对象中的属性过多,会影响使用,一般不建议开深度监听

  39. // 深度监听
  40. watch(form, (newval, oldVal) => {
  41.     console.log("深度监听触发")
  42.     console.log(newval);
  43. }, { deep: true })

  44. // 精确侦听对象的某个属性
  45. watch(
  46.     () => form.value.price,
  47.     (newVal, oldVal) => {
  48.         console.log("精确侦听对象的某个属性");
  49.         console.log(newVal, oldVal);
  50.     }
  51. )

  52. // 可以侦听某两个属性操作后的值
  53. watch(
  54.     () => Number(form.value.price) * Number(form.value.count),
  55.     (sum) => {
  56.         console.log("执行了");
  57.         form.value.total = ''
  58.         if (sum) {
  59.             form.value.total = sum.toFixed(2);
  60.         }
  61.     }
  62. )
  63. </script>
复制代码



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2025 Suike Tech All Rights Reserved. 随客交流社区 (备案号:津ICP备19010126号) |Processed in 0.103827 second(s), 9 queries , Gzip On, MemCached On.
关灯 在本版发帖返回顶部
快速回复 返回顶部 返回列表