美文网首页
[vue3新特性] 5.组合api——6.侦听器

[vue3新特性] 5.组合api——6.侦听器

作者: 林哥学前端 | 来源:发表于2021-10-15 08:40 被阅读0次

和计算属性computed一样,在组合API中侦听器也是一个函数,在使用时需要先导入

import { watch } from 'vue'

1.侦听简单数据类型的值

1)最基础的使用

我们来声明一个counter计数,然后在onMounted中把它加一,使用watch来侦听它的改变,
watch第一个参数接受你要侦听的数据,第二个参数是数据变化后的回调函数

watch(counter, () => {
  console.log('counter变化了' )
})

这样就可以对counter进行监听了

完整的代码:

<template>
  <div>{{ counter }}</div>
</template>

<script>
import { ref, watch, onMounted } from 'vue'
export default {
  name: 'App',
  setup() {
    const counter = ref(0)
    watch(counter, () => {            // 新增
      console.log('counter变化了')
    })
    onMounted(() => {
      counter.value++
    })
    return {
      counter,
    }
  },
}
</script>

在浏览器中打开,控制台输出了

counter变化了

2)获取改变前后的值

这个跟我们之前学的一样,在watch的回调函数中,有两个参数
第一个表示改变以后的值
第二个表示改变以前的值

watch(counter, (newVal, oldVal) => {
  console.log('counter变化了,现在的值是:' + newVal, '原来的值是:' + oldVal)
})

改好代码以后我们在浏览器控制台中查看,输出了

counter变化了,现在的值是:1 原来的值是:0

3)immediate选项

watch函数还接受第三个参数,就是选项对象,其中有immediate选项,也跟之前学习的一样,把immediate设置为true后,开始就会执行一遍回调函数

    watch(
      counter,
      (newVal, oldVal) => {
        console.log(
          'counter变化了,现在的值是:' + newVal,
          '原来的值是:' + oldVal
        )
      },
      {
        immediate: true,   // 新增
      }
    )

控制台输出

counter变化了,现在的值是:0 原来的值是:undefined
counter变化了,现在的值是:1 原来的值是:0

后面的内容有些和官网不同,是我自己试验出来的用法

2.侦听数组类型的变化

1)只要侦听变化,不需要得到变化前的值

简单来说这样和侦听简单类型一样,我们来举个例子
先声明一个数组

const list = reactive(['苏格拉底', '柏拉图', '亚里士多德'])

在onMounted时,给数组增加一项

onMounted(() => {
  list.push('亚历山大')
})

侦听和简单类型一样

    watch(list, () => {
      console.log('列表变化了')
    })

这时候控制台就会打印

列表变化了

2)需要知道数组变化前后的值

这时候第一个参数的写法要变一下,要写成一个函数,返回这个数据的一个副本

    watch(
      () => [...list],
      (newVal, oldValue) => {
        console.log('列表变化了')
        console.log(newVal)
        console.log(oldValue)
      }
    )

我们看到第一个参数的函数返回的是一个新对象,是list的一个副本
这样就可以获取改变之前的值了
控制台输出



这种方式是官网写的方式。

3.侦听对象的变化

1)不用获取变化之前的值,也是和简单类型是一样的

现在我们来写一个person对象

    const person = reactive({
      name: '林哥',
      age: 18,
      job: {
        name: '前端工程师',
        salary: '3k',
      },
    })

然后我们在onMounted的时候把salary改为4k

    onMounted(() => {
      person.job.salary = '4k'
    })

最后添加侦听

    watch(person, () => {
      console.log('person变化了')
    })

控制台输出

person变化了

2)需要知道变化前后的值

这时候,watch的第一个参数需要返回深度克隆的要监听的数据,
在顶部导入lodash库,使用它的cloneDeep方法

import { cloneDeep } from 'lodash'

同时还要把watch的deep选项设置为true

    watch(
      () => cloneDeep(person),  // 新增
      (newVal, oldValue) => {
        console.log('person变化了')
        console.log(newVal)
        console.log(oldValue)
      },
      {
        deep: true,  // 新增
      }
    )

这样就可以得到变化之前的值了



这个写法是官网的写法

3)直接侦听对象里面的简单数据类型

这个例子中,只有salary这个字段变化了,我们可以直接侦听这一个简单类型的字段,
这样深度克隆和deep选项都不用了

    watch(
      () => person.job.salary,
      (newVal, oldValue) => {
        console.log('salary变化了')
        console.log(newVal)
        console.log(oldValue)
      }
    )

控制台输出

salary变化了
4k
3k

关于watch内容看上去挺多,其实好多都是之前学习过的,比如deep、immediate等,
新内容主要在于监听复杂类型时,watch函数第一个参数的写法,大家一定要自己动手写一写,看看到底什么情况下会触发watch。

相关文章

网友评论

      本文标题:[vue3新特性] 5.组合api——6.侦听器

      本文链接:https://www.haomeiwen.com/subject/cvnyoltx.html