vue3.0之-watch全面解析

2023-11-07

1、监听ref()创建的基本数据类型

栗子1,监听多个数据

<template>
    <div class="">
        <h1>{{url}}</h1>
        <h1>{{sum}}</h1>
        <button @click="url+='6'">修改url</button>
        <button @click="sum++">修改sum</button>
    </div>
</template>
<script>
import { watch, ref} from 'vue';
export default {
    name:"",
    setup(){
        let url=ref("www.webtools.wang");
        let sum=ref(1);
        watch([sum,url],(newvalue,oldvalue)=>{
            console.log(newvalue,oldvalue)
        },{immediate:false})
        return {
            sum,
            url
        }
    }
}
</script>

-----------------------------------------------------------------------

栗子2,监听1个数据
<template>
    <div class="">
        <h1>{{url}}</h1>
        <button @click="url+='6'">修改url</button>
        <button @click="sum++">修改sum</button>
    </div>
</template>
<script>
import { watch, ref} from 'vue';
export default {
    name:"",
    setup(){
        let url=ref("www.webtools.wang");
        watch(url,(newvalue,oldvalue)=>{
            console.log(newvalue,oldvalue)
        },{immediate:false})
        return {
            url
        }
    }
}
</script>

2、监听ref()创建的的对象

ref()的作用是创建响应式数据,vue3.x创建响应式数据还有一个函数,reactive(),二者的区别是:前者主要负责基本数据类型,后者只能创建应用类型的响应式数据。当然如果一定要用ref()创建对象类型的响应式数据的话,它也是能够处理的,在vue3.x内部,最终会交由reactive()处理。

栗子1
<template>
    <div>
        <h1>{{person.name}}</h1>
        <h1>{{person.age}}</h1>
        <button @click="person.age++">修改age</button>
    </div>
</template>
<script>
import {ref,watch} from 'vue'
export default {
    name:"",
    setup(){
        let person=ref({
            name:"chenxuan",
            age:18
        })
        // 此处监听不到
        // watch(person,(newvalue,oldvalue)=>{
        //     console.log("监听到了变化!")
        // })

        // 解决方法1
        // 使用ref创建引用类型的响应数据,在vue内部最终还是通过reactive实现的
        // person.value 相当于在监听reactive创建的响应数据
        // watch(person.value,(newvalue,oldvalue)=>{
        //     console.log("监听到了age变化!")
        // })

        // 解决方法2,开启深度监听
        watch(person.value,(newvalue,oldvalue)=>{
            console.log("监听到了age变化!")
        },{deep:true})
        return{
            person
        }
    }
}
</script>

3、监听reactive创建的对象

栗子1
<template>
    <div class="">
        <h1>{{person.name}}</h1>
        <h1>{{person.age}}</h1>
        <h1>{{person.school.address}}</h1>
        <button @click="person.name+='~'">修改name</button>
        <button @click="person.age++">修改age</button>
        <button @click="person.school.address+='!'">修改嵌套较深的数据</button>
    </div>
</template>
<script>
import { watch, reactive} from 'vue';
export default {
    name:"",
    setup(){
        let person=reactive({
            name:"www.webtools.wang",
            age:18,
            school:{
                address:"北京大学"
            }
        });
        watch(person,(newvalue,oldvalue)=>{
            console.log("监听到了")
        })
        return {
            person
        }
    }
}

</script>

注:这种监听方式有问题
1、强制开启深度监听,并且deep:false不起作用,可能监听了很多与业务需求不符的数据,造成资源浪费
2、oldvalue无法获取

------------------------------------------------------------

栗子2,精确监听,解决强制开启深度监听导致的资源浪费问题

<template>
    <div class="">
        <h1>{{person.name}}</h1>
        <h1>{{person.age}}</h1>
        <h1>{{person.school.address}}</h1>
        <button @click="person.name+='~'">修改name</button>
        <button @click="person.age++">修改age</button>
        <button @click="person.school.address+='!'">修改嵌套较深的数据</button>
    </div>
</template>
<script>
import { watch, reactive} from 'vue';
export default {
    name:"",
    setup(){
        let person=reactive({
            name:"chenxuan",
            age:18,
            school:{
                address:"北京大学"
            }
        });
        watch(()=>person.age,(newvalue,oldvalue)=>{
            console.log("监听到了age变化")
        })
        watch(()=>person.name,(newvalue,oldvalue)=>{
            console.log("监听到了name变化")
        })
        return {
            person
        }
    }
}
</script>


--------------------------------------------------’

栗子3,精确监听多个属性值
<template>
    <div class="">
        <h1>{{person.name}}</h1>
        <h1>{{person.age}}</h1>
        <h1>{{person.school.address}}</h1>
        <button @click="person.name+='~'">修改name</button>
        <button @click="person.age++">修改age</button>
        <button @click="person.school.address+='!'">修改嵌套较深的数据</button>
    </div>
</template>
<script>
import { watch, reactive} from 'vue';
export default {
    name:"",
    setup(){
        let person=reactive({
            name:"chenxuan",
            age:18,
            school:{
                address:"北京大学"
            }
        });
        watch([()=>person.age,()=>person.name],(newvalue,oldvalue)=>{
            console.log("监听到了age/name变化")
        })
        return {
            person
        }
    }
}
</script>

栗子4,监听嵌套较深的数据
<template>
    <div class="">
        <h1>{{person.name}}</h1>
        <h1>{{person.age}}</h1>
        <h1>{{person.school.hehe.address}}</h1>
        <button @click="person.name+='~'">修改name</button>
        <button @click="person.age++">修改age</button>
        <button @click="person.school.hehe.address+='!'">修改嵌套较深的数据</button>
    </div>
</template>
<script>
import { watch, reactive} from 'vue';
export default {
    name:"",
    setup(){
        let person=reactive({
            name:"chenxuan",
            age:18,
            school:{
                hehe:{
                    address:"北京大学"
                }
                
            }
        });
        watch(()=>person.school,(newvalue,oldvalue)=>{
            console.log("监听到了address的变化")
        },{deep:true})
        return {
            person
        }
    }
}
</script>
注:此时oldvalue依旧不能获取

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3.0之-watch全面解析 的相关文章

随机推荐

  • Linux系统中关于/etc/rc.d/rc.local中部分命令不执行的问题

    最近遇到了个奇怪的问题 费了一番周折才最终解决 在此给遇到类似问题的同学提供一条思路 在Linux系统中我们有可能需要某些命令在系统启动的时候自动运行 此时我们会想到利用文件 etc rc d rc local 按照正常逻辑 只需要将相应的
  • 通过关键字从百度中爬取相匹配图片,可以爬取多种也可以爬取一种图片

    通过re requests urlib BeautifulSoup os模块实现从百度下载指定类别图片 包含代码逐行解析 import re 进行http请求的第三方库 import requests from urllib import
  • STM32F103屏蔽JTAG/SWD 以及PC13,PC14,PC15的RTC晶振禁用。

    STM32F103屏蔽JTAG SWD 以及PC13 PC14 PC15的RTC晶振禁用 1 关于JTAG SWD屏蔽 2 PC13 PC14 PC15的RTC晶振屏蔽 1 关于JTAG SWD屏蔽 STM32F103系列上的一些IO口在标
  • 免费获取省市县的shp,geojson文件

    整理下资料 需要做准备工作 1 一个全能地图下载 https blog csdn net qq 41619796 article details 90241491 可以获取边界坐标 2 获取文件的网站 http geojson io 3 G
  • Python爬虫实战——爬取新闻数据(简单的深度爬虫)

    前言 又到了爬新闻的环节 好像学爬虫都要去爬爬新闻 没办法谁让新闻一般都很好爬呢XD 拿来练练手 只作为技术分享 这一次要的数据是分在了两个界面 所以试一下深度爬虫 不过是很简单的 数据目标 相关库 import openpyxl impo
  • 本地python连接腾讯云数据库

    文章目录 前言 免费体验一个云数据库 申请云数据库 开通外网 设置用户账号 开通外网 设置账号密码 创建数据库 用python连接数据库 前言 简单说下云数据库的概念 云的概念其实就是把网络上的服务虚拟话 比如说没有云的时候 搭建数据库 得
  • 查看僵尸进程并杀掉僵尸进程

    在运维过程中 我们经常会碰到机器由于某几个特殊的僵尸进程造成整台服务器上的进程异常卡死 负载变高 例如以下 其中 存在8个僵尸进程 并且进程19712的CPU使用异常 查看具体的僵尸进程有哪些 发现这些子僵尸进程的父进程即为19712进程
  • ASP.NET WebFrom 使用C# 连接 MySql

    内容 对于ASP NET WebFrom连接SQL database的方法网络上有很多大牛都有介绍 本文介绍一种ASP NET WebForm连接MySql database的方法 材料 Visual Studio 2017 MySql最新
  • 华为2288hv5服务器安装ESXI 6.7(一):远程访问服务器管理口

    文章目录 准备条件 实际操作 1 修改本地网卡信息 2 访问网页管理页面 3 修改管理口IP信息 4 通过Wifi登录管理页面 下一步 不管是网络设备也好 或者服务器也罢 从投入使用到寿终正寝 机房都是它们的归宿所在 但是我们不一样 机房常
  • 虎年啦,小老虎一文带你解决困扰多年Linux命令下的vim,中国人不骗中国人,好好学,工作必备,牢记

    初学者来说 先把最简单 最基础 最重要的知识点掌握好 再去研究难度较高 更加高级的知识点 这样由易到难 循序渐进的学习路径 无疑是最合理的 vi和vim是Linux下的一个文本编辑工具 可以理解为Windows的记事本 或Word文档 1
  • Win10系统下python快速安装点云库pclpy-0.11.0

    目录 一 安装Anaconda3 二 pclpy概述 三 安装pclpy 四 测试代码 五 结果展示 六 进入pclpy11环境 七 实验数据 一 安装Anaconda3 见 Anaconda详细安装及使用教程 带图文 二 pclpy概述
  • 为什么jdbc连接一个异常的源,会出现请求失败的结果

    测试1 使用jdbc mysql 1 1 3306 test 这样ip错误的url路径 jdbc会直接抛出异常 测试2 使用jdbc mysql 1 1 1 1 3306 test 这样看似正确的url路径 实际是请求不同的的ip时 请求会
  • Lan8720 网线插拔状态检测

    目的 能够实时的检测网线的插拔状态 并能够根据网线的插拔状态通知到到应用层 让应用层做相应的处理 1 解决问题的根本方法就是看lan8720的数据手册 如果说你用过一款芯片 而没有去研究过它的数据手册时 可以说你没有用过这个芯片 在Lan8
  • 条款20:当std::shared_ptr可能悬空时使用std::weak_ptr

    自相矛盾的是 如果有一个像std shared ptr 见条款19 的但是不参与资源所有权共享的指针是很方便的 换句话说 是一个类似std shared ptr但不影响对象引用计数的指针 这种类型的智能指针必须要解决一个std shared
  • 《算法:第四版》课后练习 1.1 答案

    以下答案纯属个人愚见 作为IT新手 算法代码中难免有逻辑漏洞和其他不足之处 欢迎朋友你点评拍砖 交流争辩能极大开阔思维 愿一起加油进步 1 1 19 在计算机上运行以下程序 1 public class Fibonacci 2 3 publ
  • springboot集成RedisTemplate

    RedisTemplate使用 基本信息 Maven依赖 yml配置文件 redisConfig配置类 Redis操作string Redis操作list 基本信息 spring 封装了 RedisTemplate 对象来进行对redis的
  • c语言间接级别不同_间接寻址不同问题?求解决!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 错误18error C2040 FineStu Student int 与 int 的间接寻址级别不同e vs study study study c1441Study include incl
  • python 基本概念整理

    一 简介 1 基本概念 Python 是一个高层次的结合了解释性 编译性 互动性和面向对象的脚本语言 Python 的设计具有很强的可读性 相比其他语言经常使用英文关键字 其他语言的一些标点符号 它具有比其他语言更有特色语法结构 Pytho
  • post和get调用API接口的优势分享和实例

    post和get调用API接口 POST和GET都是HTTP协议中的方法 用于客户端向服务器发送请求并获取响应 在调用API接口时 一般使用GET或POST方法 GET方法是通过URL向服务器请求资源的一种方法 在URL中 请求参数会被编码
  • vue3.0之-watch全面解析

    1 监听ref 创建的基本数据类型 栗子1 监听多个数据