vue-watch监听器

news2024/12/24 9:45:22

1. 概述

watch是 vue 中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作。

Vue官网很明确的建议我们这样使用watch侦听属性:当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

2. 用法

watch: {
   监听的属性: {
      handler(数据改变后新的值, 数据改变前旧的值) {
         编写处理逻辑
      }
   }
}

3. 监听基本类型

<template>
  <div>
    <div>
      <input type="text" v-model="something">
    </div>
  </div>
</template>
<script>
export default {
    data() {
        return {
            something: ""
        }
    },
    watch: {
        "something": {
            handler(newVal, oldVal) {
                console.log("新的值:" + newVal);
                console.log("旧的值:" + oldVal);
                console.log("hellow  world");
            }
        }
    }
}
</script>

📌 输入框中输入1、2 , 效果图如下:

在这里插入图片描述

💖 还可以 简写 如下:

watch: {
    "something"(newVal, oldVal)  {
        console.log("新的值:" + newVal);
        console.log("旧的值:" + oldVal);
        console.log("hellow  world");
    }
}

4. 监听复杂类型(数组、对象)中的某个属性

<template>
  <div>
    <div>
      <input type="text" v-model="obj.field1">
    </div>
  </div>
</template>
<script>
export default {
    data() {
        return {
            something: "",
            obj: {
                field1: "",
                field2: ""
            }
        }
    },
    watch: {
        "obj.field1"(newVal, oldVal)  {
            console.log("新的值:" + newVal);
            console.log("旧的值:" + oldVal);
            console.log("hellow  world");
        }
    }
}
</script>

📌 输入框中输入1、2 , 效果图如下:

在这里插入图片描述

5. 监听复杂类型

当需要监听一个对象的变化时,普通的 watch 方法无法监听到对象内部属性的变化,可以设置深度监听 deep: true,当对象的属性较多时,每个属性的变化都会执行 handler。

<template>
  <div>
    <div>
      <input type="text" v-model="obj.field1">
    </div>
  </div>
</template>
<script>
import { stringifyQuery } from "vue-router";

export default {
    data() {
        return {
            something: "",
            obj: {
                field1: "",
                field2: ""
            }
        }
    },
    watch: {
        "obj": {
            handler(newVal, oldVal)  {
                console.log("新的值:" + newVal);
                console.log("旧的值:" + oldVal);
                console.log("hellow  world");
            },
            deep: true
        }
    }
}
</script>

📌 输入框中输入1、2 , 效果图如下:

在这里插入图片描述

💦 vue 中用 console.log 直接打印对象显示 [object Object],使用 console.log(JSON.stringify(obj)),能把对象以 json 格式输出。

watch: {
    "obj": {
        handler(newVal, oldVal)  {
            console.log("新的值:" + JSON.stringify(newVal));
            console.log("旧的值:" + JSON.stringify(oldVal));
            console.log("hellow  world");
        },
        deep: true
    }
}

在这里插入图片描述

⚠️但是,结果发现旧的值和新的值一样,为什么呢?

对于引用类型,赋值指向是地址,地址指向堆区存储的值,所以新旧值一样,换句话说就是指向堆的同一个空间,拷贝的是地址,值也是跟着变的,一旦改变拷贝对象中某个变量的值 原始对象也会被改变;

✨解决方案:

利用深拷贝,会创建出一个新的地址指向新的空间。属性发生改变时,跟原始对象值互不干扰(这里运用了computed计算属性的暂缓特性来赋值)

<template>
  <div>
    <div>
      <input type="text" v-model="obj.field1">
    </div>
  </div>
</template>
<script>
export default {
    data() {
        return {
            something: "",
            obj: {
                field1: "",
                field2: ""
            }
        }
    },
    computed: {
        newObj() {
            return JSON.stringify(this.obj);
        }
    },
    watch: {
        "newObj": {
            handler(newVal, oldVal)  {
                console.log("新的值:" + JSON.stringify(newVal));
                console.log("旧的值:" + JSON.stringify(oldVal));
                console.log("hellow  world");
            },
            deep: true
        }
    }
}
</script>

在这里插入图片描述

6. immediate的用法和作用

immediate设置为 true,页面进来就会立即执行监听。

watch: {
    "newObj": {
        handler(newVal, oldVal)  {
            console.log("新的值:" + JSON.stringify(newVal));
            console.log("旧的值:" + JSON.stringify(oldVal));
            console.log("hellow  world");
        },
        deep: true,
        immediate: true
    }
}

在这里插入图片描述

进入页面,立即执行监听。

7. VUE3 中的 Watch 用法

🎈 VUE2 代码:

watch: {
    nums () {},
    'demo.name' () {}
}

🎈 VUE3 代码:

watch(nums, () => {})
watch(() => demo.name, () => {})

详细参考:
📖 VUE3 中的 Watch 详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【通览一百个大模型】XLNet(Google)

XLNet 欢迎订阅阅读【大模型&NLP&算法】。 作者&#xff1a;王嘉宁本文章内容为转载或整理&#xff1b;仓库链接&#xff1a;https://github.com/wjn1996/LLMs-NLP-Algo 【通览一百个大模型】XLNet&#xff08;Google&#xff09; 作者&#xff1a;王嘉宁&#xff0…

lua脚本语言学习笔记

Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。 因为我们使用redis的时候一般要写lua脚本&#xff0c;这篇文章就介绍一下lua脚本语言的基础用…

Python 算法基础篇:时间复杂度和空间复杂度简介

Python 算法基础篇&#xff1a;时间复杂度和空间复杂度简介 引言 1. 时间复杂度 a ) 常见的时间复杂度 b ) 时间复杂度示例 2. 空间复杂度 a ) 常见的空间复杂度 b ) 空间复杂度示例 结论 引言 在学习和分析算法时&#xff0c;时间复杂度和空间复杂度是两个关键概念。它们帮助…

【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )

文章目录 一、函数形参类型注解1、函数中由于类型缺省导致的提示问题2、函数形参类型注解语法3、代码示例 - 函数形参类型注解 二、函数返回值类型注解1、函数返回值类型注解语法2、代码示例 - 函数返回值类型注解 一、函数形参类型注解 1、函数中由于类型缺省导致的提示问题 由…

LSTM对比Bi-LSTM的电力负荷时间序列预测(Matlab)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

小程序api的promise化

小程序根目录cmd运行安装命令 npm install --save miniprogram-api-promise1.0.4 安装完成之后先到根目录中删除miniprogram_npm文件夹(不删除构建npm时可能会出现问题) 删除之后再在工具中点击构建npm 构建成功之后会看到根目录中重新出现了miniprogram_npm文件夹 在app.j…

P1747 好奇怪的游戏

好奇怪的游戏 题目背景 《爱与愁的故事第三弹shopping》娱乐章。 调调口味来道水题。 题目描述 爱与愁大神坐在公交车上无聊&#xff0c;于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘&#xff1a;***&#xff08;游戏名被打上了马赛克&#xff09;。这个游戏类似…

修复漏洞(三)升级Docker里面的镜像(MySQL、Nginx等)

前言 因原版本检测出来存在漏洞&#xff0c;故需升级底层镜像 步骤 先看看自己现在的是什么版本&#xff0c;教你们一个骚操作&#xff0c;查看Docker里面的Mysql或者其他容器版本都不用百度出来的这么麻烦首先docker images&#xff0c;查看镜像ID然后docker inspect 镜像I…

2、Java入门教程【IDEA】

1、下载 IDEA社区版&#xff1a;下载地址 IDEA管理JAVA程序的结构&#xff1a; project 项目、工程module 模块package 包class 类 2、创建工程 创建【project】 点击【create】后&#xff0c;项目结构如下&#xff1a; 创建【package】 我们继续在【src】目录下创建【pack…

Python中的break和continue语句应用举例

Python中的break和continue语句应用举例 在进行Python编程时候&#xff0c;有时需要&#xff0c;对循环中断或跳过某部分语句&#xff0c;此时常会用到break语句或continue语句。本文将通过实际例子阐述这两个语句的用法。 1.break语句 break语句是实现在某个地方中断循环&a…

js逆向补环境-b站志远二期最后8节课笔记

目录 一、基础知识1、什么是纯净V82、什么是BOM和DOM3、node环境/浏览器环境/V8引擎区别4、如何本地调试js补环境5、补环境相对于逆向算法的好处6、vm和vm2介绍 二、8个视频内容笔记概括1、补环境基本知识/头条案例手动插桩补2、Proxy代理/toString函数保护介绍3、补环境框架设…

安卓UI:Switch和ToggleButton

目录 一、Switch和ToggleButton介绍 Switch常用属性&#xff1a; ToggleButton属性&#xff1a; 二、Switch和ToggleButton常用方法 Switch常用方法&#xff1a; ToggleButton常用方法&#xff1a; 三、Switch和ToggleButton的使用 MainActivity: activity_main&#xff1…

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来螺旋矩阵的分享✨ 目录 前言59. 螺旋矩阵 II总结 59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 …

【C语言进阶(八)】动态内存管理

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 动态内存规划 1. 前言2. 为什么要学…

ElasticSearch索引(index)当中的增删改查操作

文章目录 一、创建索引&#xff08;Create Index&#xff09;&#xff1a;二、更新索引的设置&#xff08;Update Index Settings&#xff09;&#xff1a;三、获取当前索引的设置&#xff08;Get Index Settings&#xff09;&#xff1a;四、删除索引&#xff08;Delete Index…

Python(十三)数据类型——整数类型

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

N!9个OA高危漏洞利用工具v1.1.6

工具介绍 该工具使用了ExpDemo-JavaFX项目&#xff0c;保留了核心的数据包请求接口&#xff0c;使用jdk1.8环境开发。目前只编写了oa系列&#xff0c;对相关漏洞进行复现和分析&#xff0c;极力避免exp的误报和有效性。 关注【Hack分享吧】工众号&#xff0c;回复关键字【2305…

基于linux下的高并发服务器开发(第一章)- fcntl函数

13 / fcntl函数 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ...); 参数&#xff1a; fd : 表示需要操作的文件描述符 cmd: 表示对文件描述符进行如何操作 - F_DUPFD : 复制文件描述符,复制的是第一个参数fd&#xff0c; …

【运维工程师学习六】LAM部署搭建个人Discuz论坛

【运维工程师学习六】LAM部署搭建个人Discuz论坛 1、先卸载Mariadb再安装Mysql2、MySQL官网rpm包下载3、在rpm包路径下安装 YUM Repo 文件4、更新软件仓库本地数据库信息5、开始部署——php的安装6、搜索yum包7、开始部署——配置apache以支持php&#xff08;1&#xff09;配置…

Spring MVC 运行原理 【深度理解】

什么是MVC&#xff1f; MVC 是 Model、View 和 Controller 的缩写&#xff0c;分别代表 Web 应用程序中的 3 种职责&#xff0c;MVC是一种软件设计规范。它将业务逻辑、数据、显示分离的方法来组织代码&#xff0c;降低了视图与业务逻辑之间的双向耦合。 Model(模型)&#xf…