首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

管理数据必备;侦听器watch用法详解,vue2与vue3中watch的变化与差异

  • 25-02-22 02:41
  • 4679
  • 8085
blog.csdn.net

目录

一、侦听器(watch)是什么?

二、Vue2中的watch(Options API)

2.1、函数式写法

2.2、对象式写法

        ①对象式基础写法

        ②回调函数handler

        ③deep属性

        ④immediate属性

三、Vue3中的watch

3.1、向下兼容(Vue2)的Options API

3.2、使用Composition API

3.2.1、基础语法

3.2.2、基础用法示例

3.2.3、Vue3中的对象式写法

四、Vue3中的watchEffect

五、总结


一、侦听器(watch)是什么?

        侦听器是一个在 Vue.js 框架中用于观察和响应数据变化的机制。侦听器允许开发者指定一个函数,这个函数会在特定数据变化时自动执行。Vue.js 使用侦听器来实现数据双向绑定和响应式更新。

        说简单点,侦听器常用来监听数据的变化,并在数据变化时捕获数据变化前后的值,并执行我们声明的回调函数。

        就像现实中的监听设备一样,发现情况有变立马行动,只不过Vue中的侦听器只针对数据。

二、Vue2中的watch(Options API)

        在Vue2中,watch 是一个选项,你可以在组件中定义它来观察数据的变化。常用的包括函数式写法和对象式写法,以我个人的习惯,如果监听的需求比较简单, 也不会涉及到日后的拓展问题,就可以直接使用函数式,这样写起来简便;如果监听比较复杂,比如监听有多层的对象,或者需要用到immediate属性,又或者要方便日后拓展和维护,就用对象式,这样更清晰,更方便拓展。还有就是大型项目建议还是用对象式,统一用法比较好。

2.1、函数式写法

        此时每个被侦听的属性被当做一个“函数”,这个函数就是被侦听的属性变化后所执行的回调函数,该函数接受两个参数,第一个是变化后的新值,第二个是变化前的旧值。

  1. export default {
  2. data() {
  3. return {
  4. watchedProperty: ''
  5. };
  6. },
  7. watch: {
  8. // 当 watchedProperty 发生变化时,这个函数将被调用
  9. watchedProperty(newVal, oldVal) {
  10. // 在这里执行当 watchedProperty 改变时要执行的代码
  11. console.log(`从 ${oldVal} 变为 ${newVal}`);
  12. }
  13. }
  14. };

2.2、对象式写法

        ①对象式基础写法

        此时每个被侦听的属性被当做一个“对象”,这个对象名就是被侦听的属性名,该对象中有一个函数和若干个属性。基础写法如下:

  1. export default {
  2. data() {
  3. return {
  4. dataProperty: ''
  5. };
  6. },
  7. watch: {
  8. // 观察 dataProperty 的变化
  9. dataProperty: {
  10. // 当 dataProperty 发生变化时,这个函数将被调用
  11. handler(newVal, oldVal) {
  12. console.log(`数据从 ${oldVal} 变更为 ${newVal}`);
  13. },
  14. // 深度观察
  15. deep: true,
  16. // 立即执行观察者函数
  17. immediate: true
  18. }
  19. }
  20. };

        ②回调函数handler

        对象式写法中有个函数名为handler,名称不可自定义,该函数为被监听属性变化后所执行的回调函数,该函数接受两个参数,第一个是变化后的新值,第二个是变化前的旧值。

        ③deep属性

        deep是常用的属性:缺省值为false,只监听表层变化,设置为true后可监听深层的数值,deep选项允许你观察对象内部属性的变化。如果没有设置deep,当对象内部的属性变化时,handler函数不会被触发。见下方例子:

  1. export default {
  2. data() {
  3. return {
  4. userInfo: {
  5. name: 'John Doe',
  6. age: 30
  7. }
  8. };
  9. },
  10. watch: {
  11. userInfo: {
  12. handler(newVal, oldVal) {
  13. console.log(`用户信息从 ${JSON.stringify(oldVal)} 变更为 ${JSON.stringify(newVal)}`);
  14. },
  15. deep: true
  16. }
  17. }
  18. };

        在这个例子中,如果userInfo对象的name或age属性发生变化,handler函数将被调用,因为它使用了deep选项,但如果没有设置deep,那么只有在userInfo引用的内容发生变化时才会调用handler函数,比如将另外一个对象直接浅拷贝给userInfo。

        ④immediate属性

        immediate选项允许你在开始观察时立即执行handler函数。这一般是用在需要组件初始化时就立即执行handler函数的情况下。下面是一个例子:

  1. export default {
  2. data() {
  3. return {
  4. initialData: 'Initial Value'
  5. };
  6. },
  7. watch: {
  8. initialData: {
  9. handler(newVal, oldVal) {
  10. console.log(`初始数据从 ${oldVal} 变更为 ${newVal}`);
  11. },
  12. immediate: true
  13. }
  14. },
  15. created() {
  16. // 组件创建时,我们改变initialData的值
  17. this.initialData = 'Changed Value';
  18. }
  19. };

三、Vue3中的watch

3.1、向下兼容(Vue2)的Options API

        在Vue3中,使用Options API时,watch的用法与Vue2相同。

  1. export default {
  2. data() {
  3. return {
  4. watchedProperty: ''
  5. };
  6. },
  7. watch: {
  8. watchedProperty(newVal, oldVal) {
  9. console.log(`从 ${oldVal} 变为 ${newVal}`);
  10. }
  11. }
  12. };

3.2、使用Composition API

3.2.1、基础语法

        在Vue3的Composition API中,watch 以函数的形式存在,可以更细粒度地控制侦听器。watch函数接收两个参数:

  1. 被监听的属性:你想要观察的响应式数据源,可以是响应式引用 ref、计算属性 computed,或者返回响应式值的函数。
  2. 回调函数:当被监听的属性发生变化时调用的函数,它接收新值和旧值作为参数。

使用Composition API的watch提供了更大的灵活性,例如,你可以观察更复杂的响应式状态,或者使用watchEffect来自动追踪依赖并执行副作用。

3.2.2、基础用法示例

        在Vue 3的Composition API中,基础用法示例如下:

  1. import { watch, ref } from 'vue';
  2. export default {
  3. setup() {
  4. const watchedProperty = ref('');
  5. // 使用 watch 函数观察 watchedProperty 的变化
  6. watch(watchedProperty, (newVal, oldVal) => {
  7. console.log(`从 ${oldVal} 变为 ${newVal}`);
  8. });
  9. // 也可以观察其他响应式引用或计算属性
  10. // watch(() => someComputedProperty, (newVal, oldVal) => { ... });
  11. // 返回响应式状态供模板或其他Composition API使用
  12. return {
  13. watchedProperty
  14. };
  15. }
  16. };

3.2.3、Vue3中的对象式写法

        写法核心思想和Vue2差不多,只不过变成了箭头函数,随便给个例子就能看懂:

  1. import { ref, watch } from 'vue';
  2. // 创建响应式引用
  3. const state = ref({
  4. name: 'John Doe',
  5. age: 30
  6. });
  7. // 使用 watch 函数,同时设置 deep 和 immediate 选项
  8. watch(
  9. () => state.value, // 观察的响应式源
  10. (newVal, oldVal) => {
  11. console.log(`State changed from ${JSON.stringify(oldVal)} to ${JSON.stringify(newVal)}`);
  12. },
  13. {
  14. deep: true, // 深度观察,观察对象内部属性的变化
  15. immediate: true // 立即执行观察者函数
  16. }
  17. );

四、Vue3中的watchEffect

        Vue3提倡使用 watchEffect 自动追踪依赖并执行副作用,而不是直接用watch来进行简单的副作用的侦听。副作用通常是指那些与组件渲染无关的操作,如 API 调用、手动更改 DOM 等。watchEffect 不需要显式指定要观察的响应式状态,它会自动追踪其内部使用的响应式引用和状态。这减少了样板代码,当开发者只是想要观察属性的变化时,不用写那么多重复的代码。

  1. import { ref, watch, watchEffect } from 'vue';
  2. export default {
  3. setup() {
  4. // 创建响应式状态
  5. const count = ref(0);
  6. // 使用 watchEffect 自动追踪 count 并执行副作用
  7. watchEffect(() => {
  8. console.log(`count is now ${count.value}`);
  9. // 当 count 发生变化时,这里的代码会被自动执行
  10. });
  11. // 使用 watch 观察 count 的变化
  12. watch(count, (newValue, oldValue) => {
  13. console.log(`count changed from ${oldValue} to ${newValue}`);
  14. // 当 count 发生变化时,这里的回调函数会被调用
  15. });
  16. // 模拟用户交互,改变 count 的值
  17. function increment() {
  18. count.value++;
  19. }
  20. return {
  21. count,
  22. increment
  23. };
  24. }
  25. };

        说白了,只要将响应式数据写到watchEffect里面,就能自动侦听变化,并执行一些副作用,这样大大减少了开发时的代码负担。

五、总结

        一篇文章同时搞定Vue2和Vue3的侦听器,是不是很棒?不要忘了Vue3中多了一个可选项watchEffect噢。

        意犹未尽?更多精彩前端好文请关注:各种前端问题的技巧和解决方案

        博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览62647 人正在系统学习中
注:本文转载自blog.csdn.net的Watermelo617的文章"https://blog.csdn.net/RenGJ010617/article/details/139552256"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top