Hi FE !
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
  • vue3 中的watch

vue3 中的watch

接受三个参数: 参数1:监听的数据源 (可以为一个ref或者一个函数) 参数2: 回调函数 (newValue, oldValue) => {} 参数3: 深度监听或立即执行的配置(deep: true, imediate: true)

首先展示ref 监听的常规写法:

<template>
  <div>
  {{qdleader}}
      <button @click="changeData"></button>
  </div>

</template>

<script>

import {ref, toRefs, watch, reactive} from 'vue';

export default {
  setup() {
    const qdleader = ref('qdleader')
    const changeData = () => {
      qdleader.value = "我变了"
    }
    watch(qdleader,(newValue,oldValue) => {
        console.log("qdleader发生变化时候",newValue,oldValue)
      })
    return {
      qdleader,
      changeData
    }
  }
}
</script>

2.在state 的写法中怎么用呢? 注意在这里你直接写state.qdleader是不好使的,你要写() => state.qdleader

<template>
  <div>
  {{qdleader}}
  <button @click="changeData"></button>
  </div>
</template>

<script>

import {ref, toRefs, watch, reactive} from 'vue';

export default {
  setup() {
    const state = {
      qdleader:'qdleader',
      changeData: () => {
        state.qdleader = '我变了'
      }
    }

    watch(() => state.qdleader,(newValue,oldValue) => {
        console.log("qdleader发生变化时候",newValue,oldValue)
    })
    return {
      ...toRefs(state)
    }
  }
}
</script>

那什么时候用第三个参数呢?怎么用呢?

<template>
  <div>
  {{qdleader}}
  <button @click="changeData"></button>
  </div>
</template>

<script>

import {ref, toRefs, watch, reactive} from 'vue';

export default {
  setup() {
    const state = {
      qdleader:'qdleader',
      a:{
        b:''
      },
      changeData: () => {
        state.a.b = '我变了'
      }
    }

    watch(() => state.a,(newValue,oldValue) => {
        console.log("qdleader发生变化时候",newValue,oldValue)
    })
    return {
      ...toRefs(state)
    }
  }
}
</script>

当我们监听对象属性时候,监听a,当a对象中的b发生变化时候,我们会发现,我们根本监听不到。

这时我们的第三个属性就闪亮登场了。

<template>
  <div>
  {{qdleader}}
  <button @click="changeData"></button>
  </div>
</template>

<script>

import {ref, toRefs, watch, reactive} from 'vue';

export default {
  setup() {
    const state = {
      qdleader:'qdleader',
      a:{
        b:''
      },
      changeData: () => {
        state.a.b = '我变了'
      }
    }

    watch(() => state.a,(newValue,oldValue) => {
        console.log("qdleader发生变化时候",newValue,oldValue)
    },{
        deep:true, //深度监听
        imediate:true,//一进页面就监听
      })
    return {
      ...toRefs(state)
    }
  }
}
</script>

watch监视多个属性 首先明确watch接受三个参数(要监视的数据,回调函数,配置项)

第一种方式

const num1= ref(1)
const num2 = ref(2)
watch(() => [num1.value, num2.value], (newVal, oldVal) => {
    console.log(newVal, oldVal); 
    console.log(newVal[0], oldVal[0], newVal[1], oldVal[1]);
})

第二种方式

const num1 = ref(1)
const num2 = ref(2)
watch(() => [num1.value, num2.value], ([preNum1, preNum2], [oldNum1, oldNum2]) => {
    console.log(preNum1, oldNum1, preNum2, oldNum2);
})

当我们要写多个监听方法时候可以写多个watch吗,会覆盖吗。。

直接在下面写就可以,不会覆盖的。

另外我们在这里介绍一个跟watch 类似的一个api

watchEffact

<template>
  <div>
  {{qdleader}}
  <button @click="changeData"></button>
  </div>
</template>

<script>

import {ref, toRefs, watch, reactive, watchEffact} from 'vue';

export default {
  setup() {
    const state = {
      qdleader:'qdleader',
      content:'',
      a:{
        b:''
      },
      changeData: () => {
        state.qdleader = '我变了'
        state.content = '我变了'
      }
    }

    watchEffact(() => {
      console.log(state.qdleader,'改变了')
    })
    return {
      ...toRefs(state)
    }
  }
}
</script>

watchEffact与watch的区别:

1、watch 是需要传入侦听的数据源,而 watchEffect 是自动收集数据源作为依赖。

2、watch 可以访问侦听状态变化前后的值,而 watchEffect 不可。

3、watch 是属性改变的时候执行,而 watchEffect 是默认会执行一次,然后属性改变也会执行。

Edit this page
最近更新: 2025/6/27 02:24
Contributors: qdleader
qdleader
本站总访问量 129823次 | 本站访客数 12人