侦听器watch

news2024/11/24 19:42:04

 在代码逻辑中监听某个数据的变化,这个时候就需要用侦听器 watch 来完成了;

1.data的watch

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
 
  <div id="app">
    <h2>{{message}}</h2>
    <button @click="changeMessage">修改message</button>
  </div>
   
  <script src="../lib/vue.js"></script>
  <script>
    // Proxy -> Reflect
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data() {
        return {
          message: "Hello Vue",
          info: { name: "why", age: 18 }
        }
      },
      methods: {
        changeMessage() {
          this.message = "你好啊, 李银河!"
          this.info = { name: "kobe" }
        }
      },
      watch: {
        // 1.默认有两个参数: newValue/oldValue
        message(newValue, oldValue) {
          console.log("message数据发生了变化:", newValue, oldValue)
        },
        info(newValue, oldValue) {
          // 2.如果是对象类型, 那么拿到的是代理对象
          // console.log("info数据发生了变化:", newValue, oldValue)
          // console.log(newValue.name, oldValue.name)
 
          // 3.获取原生对象
          // console.log({ ...newValue })
          console.log(Vue.toRaw(newValue))
        }
      }
    })
 
    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>
      watch: {
        // 1.默认有两个参数: newValue/oldValue
        message(newValue, oldValue) {
          console.log("message数据发生了变化:", newValue, oldValue)
        }
}

          // 2.如果是对象类型, 那么拿到的是代理对象 

      watch: {
        // 1.默认有两个参数: newValue/oldValue
        message(newValue, oldValue) {
          console.log("message数据发生了变化:", newValue, oldValue)
        },
        info(newValue, oldValue) {
          // 2.如果是对象类型, 那么拿到的是代理对象
          console.log("info数据发生了变化:", newValue, oldValue)
          // console.log(newValue.name, oldValue.name)
 
          // 3.获取原生对象
          // console.log({ ...newValue })
          console.log(Vue.toRaw(newValue))
        }
      }

2.watch侦听配置器选项:deep与immediate

 当我们点击按钮的时候会修改 info.name 的值;
 这个时候我们使用 watch 来侦听 info ,可以侦听到吗?答案是不可以。
 这是因为默认情况下, watch 只是在侦听 info 的引用变化,对于内部属性的变化是不会做出响应的:
 这个时候我们可以使用一个选项 deep 进行更深层的侦听


 注意前面我们说过 watch 里面侦听的属性对应的也可以是一个 Object ;
 还有另外一个属性,是希望一开始的就会立即执行一次:
 这个时候我们使用 immediate 选项;
 这个时候无论后面数据是否有变化,侦听的函数都会有限执行一次;

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
 
  <div id="app">
    <h2>{{ info.name }}</h2>
    <button @click="changeInfo">修改info</button>
  </div>
   
  <script src="../lib/vue.js"></script>
  <script>
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data() {
        return {
          info: { name: "why", age: 18 }
        }
      },
      methods: {
        changeInfo() {
          // 1.创建一个新对象, 赋值给info
          // this.info = { name: "kobe" }
 
          // 2.直接修改原对象某一个属性
          this.info.name = "kobe"
        }
      },
      watch: {
        // 默认watch监听不会进行深度监听
        // info(newValue, oldValue) {
        //   console.log("侦听到info改变:", newValue, oldValue)
        // }
 
        // 进行深度监听
        info: {
          handler(newValue, oldValue) {
            console.log("侦听到info改变:", newValue, oldValue)
            console.log(newValue === oldValue)
          },
          // 监听器选项:
          // info进行深度监听
          deep: true,
          // 第一次渲染直接执行一次监听器
          immediate: true
        },
        "info.name": function(newValue, oldValue) {
          console.log("name发生改变:", newValue, oldValue)
        }
      }
    })
 
    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>
watch: {
        // 默认watch监听不会进行深度监听
        // info(newValue, oldValue) {
        //   console.log("侦听到info改变:", newValue, oldValue)
        // }
 
        // 进行深度监听,语法糖书写
        info: {
          handler(newValue, oldValue) {
            console.log("侦听到info改变:", newValue, oldValue)
            console.log(newValue === oldValue)
          },
          // 监听器选项:
          // info进行深度监听
          deep: true,
          // 第一次渲染直接执行一次监听器
          immediate: true
        },
      }


 

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
 
  <div id="app">
    <h2>{{message}}</h2>
    <button @click="changeMessage">修改message</button>
  </div>
   
  <script src="../lib/vue.js"></script>
  <script>
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data() {
        return {
          message: "Hello Vue"
        }
      },
      methods: {
        changeMessage() {
          this.message = "你好啊, 李银河!"
        }
      },
      // 生命周期回调函数: 当前的组件被创建时自动执行
      // 一般在该函数中, 会进行网络请求
      created() {
        // ajax/fetch/axios
        console.log("created")
 
        this.$watch("message", (newValue, oldValue) => {
          console.log("message数据变化:", newValue, oldValue)
        }, { deep: true })
      }
    })
 
    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>

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

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

相关文章

备战秋招 | 笔试强训6

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、十进制变量i的值为100&#xff0c;那么八进制的变量i的值为&#xff08;&#xff09; A. 146 B. 148 C. 144 D. 142 2、执行下面语句后的输出为 int I1; if(I<0)printf("****\n") …

Java框架 Mybatis入门

0目录 Java框架Mybatis 1..框架介绍 2.Mybatis实战 1.框架介绍 补充MVC思想 为什么使用框架&#xff1f; 效率高&#xff0c;成本低 框架是别人写好的&#xff0c;可以直接调用 框架是基于MVC的思想 框架包中含有MVC思想的所有组成模块&#xff1a;控制层&#xff1b;模型…

zabbix 企业级监控(1) 监控自己

重点一 Zabbix简介在企业网络运维过程中&#xff0c;管理员必须随时关注各服务器和网络的运行状况&#xff0c;以便及时发现问题&#xff0c;尽可能减少故障的发生。当网络中的设备&#xff0c;服务器等数量较多时&#xff0c;为了更加方便&#xff0c;快捷的获得监控信息&…

欧姆龙CP系列PLC以太网通讯欧姆龙cp1e怎么用以太网通讯

大家好&#xff0c;今天要和大家分享的是一款在工控领域中非常实用的产品——捷米特JM-ETH-CP转以太网模块。这款模块采用了即插即用的设计&#xff0c;不仅不会占用PLC的通讯口&#xff0c;而且可以通过复用接口让触摸屏与PLC进行通讯。这个设计真的非常巧妙&#xff0c;相信会…

7-Spring cloud之路由网关zuul

7-Spring cloud之路由网关zuul 1. 前言2. 关于zuul2.1 zuul基本原理2.2 为什么要使用zuul 3. 搭建zuul3.1 项目结构3.2 基本配置3.2.1 pom文件3.2.2 yml文件3.3.3 启动类 3.3 测试看效果3.3.1 演示3.3.1 架构图 4. zuul路由访问映射规则4.1 映射服务提供者的服务名4.2 访问加前…

概率论的学习和整理--番外13:一个经典dubo模型的概率计算等

目录 1 经典模型知识科普 1.1 知识来源 1.2 下面是摘取的部分规则 2 这个经典dubo的概率和期望 2.1 网上计算的概率&#xff0c;期望全是负&#xff0c;赌徒悲剧 2.2 为什么会这样呢 3 假设把下注庄家不抽水&#xff0c;获得100%收益而不是95&#xff0c;多少次后可以赢…

桥梁监测需要哪些设备?

随着我国经济的发展&#xff0c;我国桥梁建设也迈上了新的台阶。截至2022年底&#xff0c;我国的公路桥梁总数达到了103.32万座。然而&#xff0c;随着在役桥梁使用时间的增长&#xff0c;承载能力受到荷载、环境以及结构退化等因素的影响&#xff0c;桥梁安全问题日益凸显。桥…

生成式AI管理规则落地 大模型后时代到来

国家网信办等七部门联合颁布的《生成式人工智能服务管理暂行办法》&#xff0c;给中国生成式AI产业树立了发展规范。 这份监管文件的用意并不止于管控&#xff0c;还用大量的笔墨传递出推动产业发展的原则&#xff0c;尤其强调“鼓励生成式人工智能技术在各行业、各领域的创新…

Unity 锚点 Anchors的通俗易懂详解

一、锚点Anchors是什么 当你在Canvas下建子物体的时候&#xff0c;选中子物体就会自带四个△&#xff0c;如下 这个三角也可以是分开的&#xff0c;如下 值得一提的是&#xff0c;这四个三角只能组成一个矩形&#xff0c;或者一个点&#xff0c;例&#xff08;矩形&#xff09…

YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

前言 最近我在做论文实验时从MSCOCO数据集中筛选了符合条件的1260张图片&#xff0c;但数据样本太少了&#xff0c;于是我就利用数据增强的方法实现了带标签的样本扩充&#xff0c;最后扩充为7560张图片。本文就来记录一下过程&#xff0c;有不懂的地方欢迎留言噢~ 目录 前言…

40.构造函数与析构函数

目录 1.构造函数 构造函数在以下情况被调用&#xff1a; 构造函数可以具有以下特点&#xff1a; 下面是一个简单的示例代码&#xff0c;展示了一个类的构造函数的定义和用法&#xff1a; 构造函数的特征 2.析构函数 析构函数的声明和定义如下&#xff1a; 以下是一…

信息安全-1网络信息安全概述

文章目录 一、概述1.1 网络安全现状 二、 网络信息安全现状与问题三、网络安全防御3.1 基本属性3.2 安全目标和功能 四、基本技术4.1 基本技术4.2 管理内容&方法4.2.3 管理要素&#xff1a; 五、信息安全管理流程六、法律法规 对网络安全和信息化工作作出重要指示 昨天突然…

OOM--除堆栈溢出外,其他几种溢出

从实践经验的角度出发&#xff0c;在处理小内存或者32位的应用问题时&#xff0c;除了Jaya堆和方法区之外&#xff0c;我们注意到下面这些区域还会占用较多的内存&#xff0c;这里所有的内存总和受到操作系统进程最大内存的限制: 直接内存:可通过-XX:MaxDirectMemorySize调整大…

CS 144 Lab Zero -- 可靠的内存字节流

CS 144 Lab Zero -- 可靠的内存字节流 环境搭建使用socket写一个网络程序In-memory reliable byte stream 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab 0 对应的PDF: Lab Checkpoint 0: networking warmup Lab 0 会省去Telnet部分内容。 环境搭建 Run Ubuntu ver…

模拟算法leetcode刷题

1)替换所有的问号: 1)模拟算法流程&#xff0c;一定要在草稿纸上过一遍流程 2)将流程转化成代码 1576. 替换所有的问号 - 力扣&#xff08;Leetcode&#xff09; class Solution {public String modifyString(String s) {char[] arrays.toCharArray();for(int i0;i<array.le…

去掉回车和换行符

1.工具用notePad 把Linux 等环境下的日志打印出来的sql 复制出来时包含换行符和回车符&#xff0c;无法直接在数据库客户端工具直接执行&#xff0c;需要去掉换行符和回车符。使用notepad 中的替换功能批量替换回车符和换行符。

6. 测试的分类以及黑盒测试、白盒测试和黑盒测试的区别

目录 1. 按照测试对象划分 1.1 界面测试 1.2 可靠性测试 1.3 容错性测试 1.5 兼容性测试 1.6 易用性测试 1.7 安装卸载测试 1.8 安全性测试 1.9 性能测试 1.10 内存泄漏测试 2. 按是否查看代码划分 2.1 黑盒测试&#xff08;Black-box Testing&#xff09; 优点 …

在 IDEA 中使用 Git 图文教程

Git 专栏索引&#xff1a; Git 分布式版本控制系统使用教程 在 IDEA 中使用 Git 图文教程 在 IDEA 中使用 Git 图文教程 &#x1f680;1. 配置 Git&#x1f680;2. 创建项目远程仓库&#x1f680;3. 初始化本地仓库&#x1f680;4. 连接远程仓库&#x1f680;5. 提交到本地仓库…

Python(二十三)运算符——赋值运算符

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

CityGML三维场景查看

今天我将展示如何读取 CityGML 文件并以 3D 方式查看其信息&#xff0c;以及如何通过挤出将shapefile转化为3D模型。 我还没有找到 3D 渲染器中可用设置的非常详细的描述&#xff0c;因此我花了一些时间测试它们。 我试图弄清楚它们的作用以及何时使用它们。 我将在本文末尾解…