第十三节:带你梳理Vue2 : watch侦听器

官方解释:

> 观察 Vue 实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式,用一个函数取代

<br/>

## 1.  侦听器的基本使用

侦听器可以监听data对象属性或者计算属性的变化

watch是观察属性的变化

所以watch的属性名必须要与观察人的名字保持一致;

只要观察的值发生了变化才会触发,

```html
<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model="msg">
</div>

<script>   
    const vm = new Vue({
        el: "#app",
        data: {
            msg:""
        },
        watch:{
            msg(){
                console.log("数据发生了变化")
                console.log(arguments)
            }
        }
    })
</script>

通过这个理解,我们就会发现, 只要数据一但发生变化,那么监听函数msg就会被触发, 监听函数中接受两个参数,第一个参数是数据变化后的新值, 第二个参数是数据变化后的旧值


尽管大部分时间我们用不到侦听器, 但侦听器对于处理异步操作非常适合,

例如我们需要将用户输入的内容延迟5秒后现在在页面上

<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model="msg">
    {{showMsg}}
</div>

<script>   

    const vm = new Vue({
        el: "#app",
        data: {
            msg:"",
            showMsg: ""
        },
        watch:{
            msg(){
                let newValue = this.msg
                setTimeout(() => {
                    this.showMsg = newValue
                },5000)
            }
        }


    })
</script>

2. 获取旧值

侦听器在数据发生变化的时候就会触发,触发时,数据已经更新,我们那到就是新值,那么我们如何获取之前的旧值呢

其实当监听的属性发生变化时,侦听器会被传入两个参数

第一个参数:侦听器所监听属性的当前值,即更新后的值

第二个参数: 原来旧值

<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model="msg">
</div>

<script>   
    const vm = new Vue({
        el: "#app",
        data: {
            msg:"",
        },
        watch:{
            msg(val, oldval){
                console.log(val);
                console.log(oldval);            
            }
        }
    })
</script>

3. 监听data对象中某个对象的属性

data属性中的数据值除了是基本数据类型的数据外,还有可能是对象类型,那么我们如何监听对象数据的属性的

<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model.number="fruit.price">

</div>

<script>   

    const vm = new Vue({
        el: "#app",
        data: {
            fruit:{
                name:"苹果",
                price: 20
            },
        },
        watch:{
            fruit(val, oldval){
                console.log(val);
                console.log(oldval);            
            }
        }
    })
</script>

如果我们按照之前的监听方式, 那么我们就会发现,当我们修改fruit属性值的时候,侦听器不会被触发, 侦听器会在fruit对象整体被修改时触发.


为了监听对象里某个特定属性的变化,可以在侦听器的名称中使用.操作符, 就像访问这个对象的属性

<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model.number="fruit.price">

</div>

<script>   

    const vm = new Vue({
        el: "#app",
        data: {
            fruit:{
                name:"苹果",
                price: 20
            },
        },
        watch:{
            "fruit.price"(val, oldval){
                console.log(val);
                console.log(oldval);            
            }
        }
    })
</script>

4. 深度监听

通过上面的例子,我们知道,我们可以监听对象的特定属性的变化,可以我们想监听整个对象的所有属性的变化就需要给对象所有的属性添加监听就不是特别的好,如果我们只是单纯的监听对象,那么属性的变化并不会触发监听器,只有整个对象被替换时才会触发

所以我们可以通过deep属性来开启对象的深度监听,

4.1 deep 选项

为了发现对象内部值的变化,可以在选项参数中指定 deep: true。注意监听数组的变更不需要这么做。

如果需要开启深度监听,那么监听器将不再是一个函数,而需要写成一个对象,对象中配置deep属性

<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model.number="fruit.price">

</div>

<script>   
    const vm = new Vue({
        el: "#app",
        data: {
            fruit:{
                name:"苹果",
                price: 20
            },
        },
        watch:{
            fruit:{// 此时fruite 就是一个配置对象,里面的属性都是配置选项
                // handler 就是原来的监听函数, 当数据变化是执行的函数
                handler(val,oldval){
                    console.log(val);
                    console.log(oldval);            

                },
                // 深度监听选项
                deep:true
            }
        }
    })
</script>

此时我们就做到了即监听这整个对象的变化, 也简体对象里面所有的属性的变化,


4.2 immediate选项

监听除了deep选项外,还有immediate选项

指定 immediate: true 将立即以表达式的当前值触发回调,

watch:{
    fruit:{// 此时fruite 就是一个配置对象,里面的属性都是配置选项
        // handler 就是原来的监听函数, 当数据变化是执行的函数
        handler(val,oldval){
            console.log(val);
            console.log(oldval);            

        },
            // 深度监听选项
        deep:true,
        immediate: true  // 理解执行监听函数handler
    }
}

5. 引用类型深度监听后,属性变化,获取新旧值问题

但是细心的朋友就会发现我们在改变对象属性的时候,虽然触发了侦听器,但是我没发获取旧值了,我们拿到的两个形参的值都是对象更改后的新值.

出于某种原因没有深入过滤对象的每个属性,那么只能监听到对象的变化,而JavaScript里对象的赋值是引用赋值,虽然属性变化了,但是它引用的地址却一直没有变化,这样的话,当对象的属性值改变了,Vue虽然知道它改变了,但也只能循着引用地址去获得对象,可此时对象的属性的值已经改变了,因此Vue并不能得到变异之前的值。

示例:

<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model.number="fruit.price">

</div>

<script>   

    const vm = new Vue({
        el: "#app",
        data: {
            fruit:{
                name:"苹果",
                price: 20
            },

        },
        watch:{
            fruit:{
                handler(val,oldval){
                    console.log(11)
                    console.log(val);
                    console.log(oldval);            

                },
                deep:true
            }
        },

    })
</script>

此时当数据发生变化是, 查看handler 两个参数值

监听属性.png


5.1 解决方案: 利用计算属性

官方方案: 观察 Vue 实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式,用一个函数取代


既然 watch无法在变异对象或数组时监听新旧值,那么我们可以先使用JSON.parse()来浅复制一遍data对象,然后在复制的对象上修改,完了重新赋值给该data对象,这样变化前后两个对象是完全不一样的,因为它们的引用地址完全不一样,Vue可以循着两个引用地址获得新旧两个

<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model.number="fruit.price">

</div>

<script>   

    const vm = new Vue({
        el: "#app",
        data: {
            fruit:{
                name:"苹果",
                price: 20
            },

        },
        watch:{
            fruitNew:{
                handler(val,oldval){
                    console.log(11)
                    console.log(val);
                    console.log(oldval);            

                },
                deep:true
            }
        },
        computed:{
            fruitNew(){
                return JSON.parse(JSON.stringify(this.fruit));
            }
        },
    })
</script>

6. 可以通过Vue是实例对象的$watch属性来监听

除了 watch 选项之外,您还可以使用命令式的 vm.$watch ,通过Vue实例对象来监听数据


6.1 普通监听

可以通过实例对象调用$watch设置监听

<!-- 监听字符变化-->
<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model="msg">

</div>

<script>   
    const vm = new Vue({
        el: "#app",
        data: {
            msg:'你好'
        }
    })
    
    // $watch 是一个实例方法
    vm.$watch("msg",(val,newVal) => {
        console.log(val)
        console.log(newVal);       
    })
</script>

6.2 监听配置

<div id="app">
    <!-- 监听器 -->
    <input type="text" v-model.number="fruit.price">
</div>

<script>   
    const vm = new Vue({
        el: "#app",
        data: {
            fruit:{
                name:"苹果",
                price: 20`在这里插入代码片`
            },
        }
    })
    
    // $watch 是一个实例方法
    vm.$watch("fruit",(val,newVal) => {
        console.log(val)
        console.log(newVal);       
    },{
        deep: true
    })
</script>









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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哈夫曼树的介绍

引入 概述 基本概念 示例 算法实现 存储结构 具体步骤 示例 初始化 合并 示例 代码整合&#xff1a; //哈夫曼树的建立 //定义类型:权值双亲结点左右孩子结点 typedef struct {int weight;int parent;int lchild,rchild; }Hnode,*huffmantree; //建立 1.判断有结点&#xf…

入门四认识HTML

一、HTML介绍 1、Web前端三大核心技术 HTML&#xff1a;负责网页的架构 CSS&#xff1a;负责网页的样式、美化 JS&#xff1a;负责网页的行动 2、什么是HTML HTML是用来描述网页的一种语言。 3、Html标签 单标签<html> 双标签<h>内容</h> 4、标…

如何零基础快速制作商业画册?这篇攻略帮你搞定

随着社会经济的发展&#xff0c;商业画册作为企业形象和产品介绍的重要载体&#xff0c;越来越受到重视。然而&#xff0c;很多企业和个人由于没有设计背景&#xff0c;在面对制作商业画册时往往感到困惑。本文将为你介绍零基础快速制作商业画册的攻略&#xff0c;让你轻松搞定…

Live800:提升客服服务质量,企业应从这几个方面下功夫

客户服务质量&#xff0c;是企业为客户提供优质服务的一个重要衡量指标。通常来说&#xff0c;一个企业的客服部门在其经营活动中发挥着重要作用&#xff0c;是客户与企业之间沟通的桥梁。良好的客服服务&#xff0c;不仅能够提高客户满意度&#xff0c;还能增强企业品牌的美誉…

Java中String类常用方法

写笔记记录自己的学习记录以及巩固细节 目录 1.String类的常用方法 1.1 字符串构造 1.2 String对象的比较 1.2.1 比较两个字符串是否相等 1.2.2 比较两个字符串的大小 1.3 字符串查找 1.4 字符串的转化 1.4.1 字符串转整数 1.4.2 字符串转数字 1.4.3 大小写的转换 1…

Mysql注入详细讲解

特殊字符 0x3a:0x7e~0x23# 注入基础 联合查询注入(union) :::tips 页面将SQL查询内容显示出来&#xff0c;即为有回显&#xff0c;可以尝试联合查询注入 利用关键字union &#xff0c;union all 拼接恶意SQL语句 ::: 注入流程 有报错&#xff0c;可以利用报错。如&#xff…

day 38 435.无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

435.无重叠区间 思路 为了使区间尽可能的重叠所以排序来使区间尽量的重叠&#xff0c;使用左边界排序来统计重叠区间的个数与452. 用最少数量的箭引爆气球恰好相反。 代码 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,…

不同类型的区块链钱包有什么特点和适用场景?

区块链钱包是用于存储和管理加密货币的重要工具&#xff0c;市面上有许多不同类型的区块链钱包可供选择。以下是几种主要类型的区块链钱包及其特点和适用场景。 1.软件钱包&#xff1a; 特点&#xff1a;软件钱包是最常见的一种区块链钱包&#xff0c;通常作为软件应用程序提供…

系统工程 | 系统工程概识

系统工程是为了最好地实现系统的目的&#xff0c;对系统的组成要素、组织结构、信息流、控制机构等进行分析研究的科学方法。 它运用各种组织管理技术&#xff0c;使系统的整体与局部之间的关系协调和相互配合&#xff0c;实现总体的最优运行。 系统工程不同于一般的传统工程…

指针数组与数组指针的理解

typedef struct vexnode {int key;struct arcnode *next; }vexnode, adjlist[MVNUM]; void init(adjlist *list); void init(adjlist *list) {for(size_t i 0; i < MVNUM; i){list[i].key i;list[i].next NULL;} }上述代码编译的时候没有报错&#xff0c;但是运行的时候&…

数据仓库和数据挖掘基础

文章目录 1. 数据仓库基础知识1.1 数据仓库的基本特性1.2 数据仓库的数据模式1.3 数据仓库的体系结构 2. 数据挖掘基础知识2.1 数据挖掘的分类2.2 数据挖掘技术2.3 数据挖掘的应用过程 传统数据库在联机事务处理(OLTP)中获得了较大的成功&#xff0c;但是对管理人员的决策分析要…

LeetCode刷题笔记第2769题:找到最大的可达成数字

LeetCode刷题笔记第2769题&#xff1a;找到最大的可达成数字 题目&#xff1a; 想法&#xff1a; 从题目中可以看出&#xff0c;num经过t次增减变为x&#xff0c;x即为可达成数字。因为要求最大的可达成数字&#xff0c;需要满足num一直增加&#xff0c;x一直减少&#xff0c…

第七节:带你全面理解vue3: 其他响应式进阶API

前言: 针对vue3官网中, 响应式:进阶API 中, 我们在上一章中给大家讲解了shallowRef, shallowReactive, shallowReadonly几个API的使用. 本章主要对剩下的API 进行讲解, 我们先看一下官网中进阶API 都有那些 对于剩下这些API, 你需要了解他们创建目的, 是为了解决之前的API存在…

C语言/数据结构——每日一题(设计循环队列)

一.前言 上一次我们分享了关于队列的基本实现——https://blog.csdn.net/yiqingaa/article/details/139033067?spm1001.2014.3001.5502 现在我们将使用队列知识来解决问题——设计循环队列&#xff1a;https://leetcode.cn/problems/design-circular-queue/submissions/533299…

振弦式渗压计的维护和校准:确保数据准确性的关键步骤

振弦式渗压计是一种用于测量土壤和岩石中孔隙水压力的高精度仪器。它广泛应用于土木工程、水利工程、地质灾害监测等领域&#xff0c;准确性直接影响到工程安全和监测数据的可靠性。因此&#xff0c;对振弦式渗压计进行适当的维护和校准是至关重要的。本文将探讨振弦式渗压计的…

2024-5-6-从0到1手写配置中心Config之实现配置中心客户端

配置加载原理 在Spring中PropertySource类实现了所有属性的实例化。 启动赋值&#xff1a; 定义自定义属性配置源&#xff0c;从config-server获取全局属性&#xff1b;Spring启动时&#xff0c;插入自定义属性配置源&#xff1b;绑定属性会优先使用&#xff0c;给自定义属性…

tomcat jdbc连接池的默认配置配置方案

MySQL 5.0 以后针对超长时间数据库连接做了一个处理&#xff0c;即一个数据库连接在无任何操作情况下过了 8 个小时后(MySQL 服务器默认的超时时间是 8 小时)&#xff0c;MySQL 会自动把这个连接关闭。在数据库连接池中的 connections 如果空闲超过 8 小时&#xff0c;MySQL 将…

python期末作业:批量爬取站长之家的网站排行榜数据并保存,数据分析可视化

爬虫作业,含python爬取数据和保存文件,数据分析使用pyecharts做数据可视化 整体上分析网站的排名,直观看各个网站的热度。 数据分析之后大致的效果: 整个项目分为两个大的部分,第一部分就是抓取网站排名数据,然后保存为Excel、csv等格式,其次就是从文件中…

Advanced Installer 使用教程-自定义操作(下)

1、点击左侧“必要条件”&#xff0c;选择“运行环境” 2、这个运行环境用于设置安装前、中、后&#xff0c;各个阶段的自定义操作 3、安装过程中的自定义操作 1&#xff09;右击基本特征&#xff0c;选择新建程序包先决条件&#xff0c;在弹出的对话框中选择自己的EXE任务程…

Live800:客户为王,企业竞争的新趋势与核心要素!

在企业经营管理中&#xff0c;客户始终是最重要的资源和战略。从企业经营的角度来说&#xff0c;企业管理的核心是客户管理&#xff0c;客户管理的核心是价值创造和价值分配&#xff0c;这是企业经营的基础。这里主要讨论了企业竞争的新趋势与核心要素&#xff0c;认为客户为王…