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

和计算属性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。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容