Vue

vue3 watch 和 watchEffect的使用

2021-06-20  本文已影响0人  邢走在云端

本文章仅供个人学习记录所用

监听 ref 类型

第一个参数是响应式对象,第二个参数是回调函数

const a = ref(0)  
watch(a, (newVal, oldVal) => {
  console.log(newVal, oldVal)
})

监听 reactive 类型

首先采用 ref 的那种方式,我们会发现报错

const data = reactive({
  count: 0
})

watch(data.count, (newVal, oldVal) => { // 错误写法
  console.log(newVal, oldVal)
})
错误信息错误信息

[Vue warn]: Invalid watch source: 0** A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types. **

所以我们根据上述的报错信息,将这个参数改成一个 function的形式即可

const data = reactive({
  count: 0
})

watch(() => data.count, (newVal, oldVal) => {
  console.log(newVal, oldVal)
})

同时监听多个

watch 第一个参数可以使用数组的形式

watch([a, () => data.count], (newVal, oldVal) => {
  console.log(newVal, oldVal)
})

watchEffect的使用

// watchEffect 监听
watchEffect(() => {
  console.log(a.value, data.count) // ref  类型的需要加.value
})

🆚watch和watchEffect的特性对比

watch的特性

watchEffect的特性

高级用法

他们的高级用法等后面应用的时候单独再记录下

完整案例代码体验

<template>
  <div>
    <h1>count :{{ count }}</h1> 
    <h1>a :{{ a }}</h1>
    <button @click="increase">新增</button>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref, reactive, toRefs, watch, watchEffect } from 'vue';
export default defineComponent({
  name: 'HelloWorld',
  setup() {
    let a = ref(0)
    const data = reactive({
      count: 0,
      increase: () => { data.count ++; a.value += 2 } // 这是改变两个类型数据的方法
    })
    // watch 监听
    watch([a, () => data.count], (newVal, oldVal) => {
      console.log(newVal, oldVal)
    })
    // watchEffect 监听
    watchEffect(() => {
      console.log(a.value, data.count) // ref  类型的需要加.value
    })
    const refData = toRefs(data)
    return {
      ...refData,
      a
    }
  }
});
</script>
上一篇下一篇

猜你喜欢

热点阅读