当前位置: 首页 > news >正文

Watch数据监听详解

一、Vue2写法

1、watch使用的几种方法

1、通过 watch 监听 data 数据的变化,数据发生变化时,就会打印当前的值

 watch: {data(val, value) {console.log(val)console.log(value)}}

2、通过 watch 监听 list 数据的变化,数据发生变化时,this.number++(使用深度监听)

 data() {return {list: {'id': 1,'type': 0},number: 0}},watch: {list: {handler(newVal) {this.number++},deep: true}}

3、通过 watch 监听 data 数据的变化,数据发生变化时,执行 change 方法

 watch: {data: 'change' // 值可以为methods的方法名},methods: {change(curVal,oldVal){console.log(curVal,oldVal)}}

2、watch中的immediate、handler和deep属性

1.immediate 和 handler

  1. handler属性在watch中的作用是指定一个回调函数,在监视的数据发生变化时被调用
  2. 这样使用watch时有一个特点,就是当值第一次绑定时,不会执行监听函数,只有值发生改变时才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
 data() {return {list: {'id': 1,'type': 0},number: 0}},watch: {list: {handler(newVal) {this.number++},immediate: true}}

2.deep深度监听

        当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听

 data() {return {list: {'id': 1,'type': 0},number: 0}},watch: {list: {handler(newVal) {this.number++},deep: true}    }

        设置deep:true则可以监听到 list.id 的变化,此时会给 list 的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行 handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:

 data() {return {list: {'id': 1,'type': 0}}},watch: {'list.id': {handler(newVal, oldVal) {......},deep: true}    }

这样只会给对象的某个特定的属性加监听器

3、总结

        数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听

二、Vue3写法

侦听一个或者多个数据的变化,数据变化时执行回调函数,俩个额外参数 immediate控制立刻执行,deep开启深度侦听

1、侦听单个数据

 <script setup>// 1. 导入watchimport { ref, watch } from 'vue'const count = ref(0)// 2. 调用watch 侦听变化watch(count, (newValue, oldValue)=>{console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)})</script>

2、侦听多个数据

侦听多个数据,第一个参数可以改写成数组的写法

 <script setup>// 1. 导入watchimport { ref, watch } from 'vue'const count = ref(0)const name = ref('cp')// 2. 调用watch 侦听变化watch([count, name], ([newCount, newName],[oldCount,oldName])=>{console.log(`count或者name变化了,[newCount, newName],[oldCount,oldName])})</script>

3、immediate属性

在侦听器创建时立即出发回调,响应式数据变化之后继续执行回调

 <script setup>// 1. 导入watchimport { ref, watch } from 'vue'const count = ref(0)// 2. 调用watch 侦听变化watch(count, (newValue, oldValue)=>{console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)},{immediate: true})</script>

4、deep(深度监听)

通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行,需要开启deep

 <script setup>// 1. 导入watchimport { ref, watch } from 'vue'const state = ref({ count: 0 })// 2. 监听对象statewatch(state, ()=>{console.log('数据变化了')})const changeStateByCount = ()=>{// 直接修改不会引发回调执行state.value.count++}</script>​<script setup>// 1. 导入watchimport { ref, watch } from 'vue'const state = ref({ count: 0 })// 2. 监听对象state 并开启deepwatch(state, ()=>{console.log('数据变化了')},{deep:true})const changeStateByCount = ()=>{// 此时修改可以触发回调state.value.count++}</script>

http://www.lryc.cn/news/141569.html

相关文章:

  • UML建模以及几种类图的理解
  • opencv进阶18-基于opencv 决策树导论
  • 13.4 目标检测锚框标注 非极大值抑制
  • 【论文笔记】最近看的时空数据挖掘综述整理8.27
  • 【大模型】基于 LlaMA2 的高 star 的 GitHub 开源项目汇总
  • 解决elementUI打包上线后icon图标偶尔乱码的问题
  • yolov3加上迁移学习和适度的数据增强形成的网络应用在输电线异物检测
  • 香橙派OrangePi zero H2+ 驱动移远EC200A
  • 写一个java中如何用JSch来连接sftp的类并做测试?(亲测)
  • 【沐风老师】如何在3dMax中将3D物体转化为样条线构成的对象?
  • 2023国赛数学建模思路 - 案例:随机森林
  • wxpython:wx.html2 是好用的 WebView 组件
  • 《QT+PCL 第五章》点云特征-PFH
  • 【分享】小型园区组网场景
  • LeetCode 1267. 统计参与通信的服务器
  • 169. 多数元素(哈希表)
  • 微服务集成spring cloud sentinel
  • 2023年最新版Windows环境下|Java8(jdk1.8)安装教程
  • linux -- jdk 的安装
  • 网络安全—黑客技术(学习笔记)
  • Java入职第十一天,深入了解静态代理和动态代理(jdk、cglib)
  • Snappy算法:高速压缩和解压缩技术的顶尖玩家
  • Python中的format()函数详细讲解
  • 11. 盛最多水的容器(c++题解)
  • 历史最佳二季度表现后,爱奇艺想为用户提供更多价值
  • HDLBits-Verilog学习记录 | Verilog Language-Basics(2)
  • Ubuntu22.0网络/网卡丢失
  • Linux 常用
  • AWS 提示证书签名过期无法自动更新
  • Git版本管理(01) 简介 基本提交相关命令