Vue监听属性详细讲解

news/2024/10/18 21:26:13/

文章目录

  • 定义要监听的属性
  • 定义 watch
  • 修改监听的属性值
  • 监听数组变化
  • 监听对象变化
  • 监听计算属性变化
  • 监听事件变化
  • 监听路由变化

在 Vue 中,可以使用 watch/$watch 方法监听数据、计算属性、事件和路由的变化,从而实现数据绑定、事件监听和路由控制等功能。需要根据实际情况选择合适的监听方式,避免过度监听或监听不必要的属性,从而提高应用性能和用户体验。

定义要监听的属性

定义要监听的属性: “message” 初始值设置为 “Hello, Vue!”

data() {return {message: 'Hello, Vue!'}
}

定义 watch

下面例子中,定义了一个名为 “message” 的 watch 属性,它监听 “message” 属性的变化,并在变化时输出变化前后的值

watch: {message(newValue, oldValue) {console.log('message changed from', oldValue, 'to', newValue)}
}

修改监听的属性值

将 “message” 属性的值从 “Hello, Vue!” 修改为 “Hello, World!”
由于我们已经在 watch 属性中定义了监听函数,因此在属性值发生变化时,watch 函数会被调用,并输出变化前后的值

this.message = 'Hello, World!'

watch 函数的参数包括 newValue 和 oldValue,分别表示属性的新值和旧值
在 watch 函数中,可以根据这些参数来执行相应的操作,例如发送网络请求、更新视图等

除了监听单个属性之外,Vue 还支持监听多个属性和深度监听属性的变化
可以通过设置 watch 属性中的深度监听选项和 immediate 选项来实现这些功能

watch: {// 监听多个属性'message': function (newValue, oldValue) { /* ... */ },'firstName': function (newValue, oldValue) { /* ... */ },'lastName': function (newValue, oldValue) { /* ... */ },// 深度监听属性'user.profile': {handler: function (newValue, oldValue) { /* ... */ },deep: true},// 立即调用监听函数'message': {handler: function (newValue, oldValue) { /* ... */ },immediate: true}
}

监听数组变化

要监听数组变化,可以使用 watch 或 $watch 方法。

data() {return {items: [1, 2, 3]}
}

使用 watch 方法监听数组变化:
当数组发生变化时,watch 函数会被调用,并输出变化前后的值

watch: {items: function (newValue, oldValue) {console.log('items changed from', oldValue, 'to', newValue)}
}

需要注意的是,watch 只能监听到数组的长度变化和 $set 方法的调用,无法监听到数组元素的变化
如果需要监听数组元素的变化,可以使用 Vue 提供的 $watch 方法。例如:

created() {this.$watch('items', function (newValue, oldValue) {console.log('items changed from', oldValue, 'to', newValue)}, { deep: true })
}

使用 w a t c h 方法监听数组的变化,并设置深度监听选项由于数组的元素也是响应式的,因此当数组元素发生变化时, watch 方法监听数组的变化,并设置深度监听选项 由于数组的元素也是响应式的,因此当数组元素发生变化时, watch方法监听数组的变化,并设置深度监听选项由于数组的元素也是响应式的,因此当数组元素发生变化时,watch 函数也会被调用

监听对象变化

除了数组,Vue 中的对象也是响应式的,可以使用 watch 或 $watch 方法来监听对象的变化

data() {return {user: {name: 'Tom',age: 18}}
}

我们可以使用 watch 方法监听对象变化:

watch: {'user.name': function (newValue, oldValue) {console.log('user.name changed from', oldValue, 'to', newValue)},'user.age': function (newValue, oldValue) {console.log('user.age changed from', oldValue, 'to', newValue)}
}

如果对象的属性是动态添加的,那么 watch 方法可能无法监听到该属性的变化
这时可以使用 $watch 方法来实现动态属性的监听。例如:

created() {this.$watch('user', function (newValue, oldValue) {console.log('user changed from', oldValue, 'to', newValue)}, { deep: true })
}

监听计算属性变化

计算属性是一种特殊的属性,它的值是根据其他属性计算得出的

computed: {fullName() {return this.firstName + ' ' + this.lastName}
}

计算属性的值是根据其他属性计算得出的,因此如果监听的属性发生变化,计算属性的值也会发生变化,从而触发 watch 函数的调用
如果不需要监听属性的变化,可以使用 computed 属性来定义普通的计算属性,而不是监听计算属性

watch: {fullName: function (newValue, oldValue) {console.log('fullName changed from', oldValue, 'to', newValue)}
}

监听事件变化

组件可以通过 $emit 方法触发自定义事件,如果要监听事件的变化
可以使用 $on 方法。
定义一个名为 “my-event” 的自定义事件,并在方法中使用 $emit 方法触发事件,并传递参数 “hello”

<template><button @click="onClick">Click me</button>
</template><script>
export default {methods: {onClick() {this.$emit('my-event', 'hello')}}
}
</script>

在父组件中使用 $on 方法监听自定义事件:

<template><div><my-component @my-event="onEvent"></my-component></div>
</template><script>
import MyComponent from './MyComponent.vue'export default {components: { MyComponent },methods: {onEvent(value) {console.log('event value:', value)}}
}
</script>

我们在父组件中使用 @my-event 属性监听自定义事件,并在方法中输出事件参数的值
当子组件触发自定义事件时,父组件的方法会被调用,并输出事件参数的值

需要注意的是,$on 方法只能在组件实例中使用,无法在 Vue 实例中使用。
如果需要在 Vue 实例中监听事件,可以使用 $emit 方法触发事件,并在 Vue 实例中使用 $on 方法监听事件。

监听路由变化

路由是一种控制页面跳转的机制,如果要监听路由的变化,可以使用 beforeRouteUpdate 钩子或 r o u t e / route/ route/watch 方法

const routes = [{path: '/',component: Home},{path: '/about',component: About  }
]

定义了两个路由:“/” 和 “/about”。可以使用 beforeRouteUpdate 钩子监听路由变化:

export default {beforeRouteUpdate(to, from, next) {console.log('route changed from', from.path, 'to', to.path)next()}
}

在组件中使用 beforeRouteUpdate 钩子,监听路由变化,并在控制台输出变化前后的路由路径
需要注意的是,beforeRouteUpdate 钩子只能在路由对应的组件中使用

如果需要在 Vue 实例中监听路由变化,可以使用 r o u t e / route/ route/watch 方法:

export default {created() {this.$watch('$route', (to, from) => {console.log('route changed from', from.path, 'to', to.path)})}
}

在 Vue 实例中使用 $watch 方法,监听 $route 属性的变化,并在控制台输出变化前后的路由路径

需要注意的是, r o u t e / route/ route/watch 方法只能在 Vue 实例中使用,无法在路由对应的组件中使用。如果需要在路由对应的组件中监听路由变化,可以使用 beforeRouteUpdate 钩子


http://www.ppmy.cn/news/63302.html

相关文章

2022级吉林大学面向对象第二次上机测试

【注&#xff1a;解答全部为本人所写&#xff0c;仅供同学们学习时参考使用&#xff0c;请勿照搬抄袭&#xff01;】 类的抽象、类的数据表示、类的实现、对象的使用 1、使用伪随机数加密的算法&#xff0c;按要求实现&#xff1a; 伪随机数加密的算法&#xff1a;根据一个给…

【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制

这一篇文章分享本人学习win32绘图编程&#xff0c;其中包括GDI绘图对象&#xff0c;绘图基础&#xff0c;基本图形的绘制&#xff0c;画笔画刷的使用&#xff0c;文本绘制&#xff0c;以及文本字体的更改。 文章目录 一.绘图基础1.BeginPaint函数2.EndPaint函数3.颜色的使用 二…

前几天面了个32岁的测试员,年薪50w问题基本都能回答上,应该刷了不少八股文···

互联网行业竞争是一年比一年严峻&#xff0c;作为测试工程师的我们唯有不停地学习&#xff0c;不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水&#xff0c;进入心仪的企业&#xff08;阿里、字节、美团、腾讯等大厂.....&#xff09; 所以&#xff0c;大家就迎来了…

如何为自己的开源项目选择许可证

就结论而言&#xff0c;如果你很随意、不在乎&#xff0c;那就选择MIT协议&#xff0c;如果要为自己的权益提供尽可能的保障&#xff0c;那就GPL&#x1f6e1;️ 为自己的软件知识产权选择许可证的必要性在于&#xff0c;如果不去选择&#xff0c;则默认为放弃了自己的全部权利…

windows误删文件怎么恢复

在日常办公中&#xff0c;由于时间的不断积累&#xff0c;会有很多的文件。在清理文件时&#xff0c;稍有疏忽就会多删了一些的文件。如果是一些不需要的文件删了就删了&#xff0c;但如果这些文件是重要的&#xff0c;该怎么办?在windows误删文件怎么恢复呢?这里有小编整理的…

JVM运行时数据区

Java和C的区别&#xff0c;体现在自动内存分配和垃圾收集技术。 JVM在执行Java程序时&#xff0c;会将它管理的内存分为若干个不同的数据区域。 这些区域有各自的作用范围以及生命周期&#xff1a; 线程私有的区域&#xff0c;随着用户线程的启动和结束而建立和销毁。线程共…

CPU 架构(x86/ARM)简介

CPU 架构通过指令集的方式一般可分为 复杂指令集&#xff08;CISC&#xff09; 和 精简指令集&#xff08;RISC&#xff09; 两类&#xff0c;CISC 主要是 x86 架构&#xff0c;RISC 主要是 ARM 架构&#xff0c;还有 MIPS、RISC-V、PowerPC 等架构。 本文重点介绍 x86 和 ARM…

谷歌浏览器 | Chrome DevTools系统学习篇-概述

Chrome DevTools是一套直接内置到谷歌Chrome浏览器的web开发工具。DevTools可以帮助您即时编辑页面并快速诊断问题&#xff0c;最终帮助您更快地构建更好的网站。我们今天的概述主要讲述谷歌浏览器的日常使用和几大常见控制面板的介绍。 目录 1.打开谷歌浏览器 2.谷歌浏览器的…