Vue3的监听属性watch和计算属性computed

监听属性watch
计算属性computed

一、监听属性watch
watch 的第一个参数可以是不同形式的“数据源,watch 可以监听以下几种数据:

一个 ref (包括计算属性)、 一个响应式对象、 一个 getter 函数、
或多个数据源组成的数组

watch 的参数:监视的回调,配置对象(deep:深度监听、immediate:立即执行…)
1、监听单个ref对象

<script setup>
  import { ref ,reactive, watch } from 'vue';
  const num = ref(0);
  //watch参数被监视的数据,监视的回调,配置对象(deep:深度监听、immediate:立即执行.....)
  const stopWatch = watch(num,(newValue,oldValue)=>{
    console.log('num新数据:'+newValue,'num旧数据:'+oldValue)
  })

  const onNumAdd = ()=>{
    num.value++;
  }

</script>

<template>
  <div>
    <div>监听属性watch:{{num}}</div>
    <button @click="onNumAdd()">num+1</button>

  </div>
</template>

在这里插入图片描述
2、监听单个 ref 对象类型 数据
如果我们直接像监听单个ref基础数据类型写,是监听不到数据的,此时我们需要手动加上deep深度监听

<script setup>
  import { ref ,reactive, watch } from 'vue';
  const user = ref({
    name:'zhangsan'
  });
  const stopWatch = watch(user,(newValue,oldValue)=>{
    console.log('user新数据:'+newValue.name,'user旧数据:'+oldValue.name)
  },{deep:true})

  const onchangeName = ()=>{
    user.value.name = 'lisi';
  }

</script>

<template>
  <div>
    <div>监听属性watch:{{user.name}}</div>
    <button @click="onchangeName()">修改名字</button>

  </div>
</template>

在这里插入图片描述
可以看出若修改的是ref定义的对象中的属性,newValue 和 oldValue 都是对应的新值,因为它们是同一个对象;若修改整个ref定义的对象,newValue 是新值, oldValue 是旧值,因为不是同一个对象了
3、监听 reactive 对象类型数据

<script setup>
  import { ref ,reactive, watch } from 'vue';
  const user = reactive({
    name:'zhangsan',
    age:20
  });
  const stopWatch = watch(user,(newValue,oldValue)=>{
    console.log('新数据:'+newValue.name,'-----旧数据:'+oldValue.name)
  })

  const onchangeName = ()=>{
    user.name = 'lisi';
  }

  const onchangeAge = ()=>{
    user.age = '22';
  }

</script>

<template>
  <div>
    <div>监听属性watch----{{user.name}}-----{{user.age}},</div>
    <button @click="onchangeName()">监听名字</button>
    <button @click="onchangeAge()">监听年龄</button>
  </div>
</template>

我们发现不需要像ref对象类型添加deep,因为默认开启深度监听
在这里插入图片描述

4、监听多个数据
监视多个数据,直接把所有数据放到数组中

<script setup>
  import { ref ,reactive, watch } from 'vue';
  const num = ref(0);
  const user = reactive({
    name:'zhangsan',
    age:20
  });
  const stopWatch = watch([num,()=>user.name,()=>user.age],(newValue,oldValue)=>{
    console.log('新数据:'+newValue,'-----旧数据:'+oldValue) //newValue[0]对应监听的第一个数据源
  })

  const onchange = ()=>{
    num.value ++;
    user.name = 'zhangsan修改';
    user.age = '20';
  }

</script>

<template>
  <div>
    <div>监听属性watch--{{num}}--{{user.name}}-----{{user.age}},</div>
    <button @click="onchange()">监听多值</button>

  </div>
</template>

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b15e70499a054ec89951575812f274ea.png
5、监听对象的某个属性
监听ref或者reactive定义的对象类型数据中的某个属性时,如果该属性值不是对象类型,需要写成函数的形式,如果是对象类型,可以直接写,也可以写成函数的形式

<script setup>
  import { ref ,reactive, watch } from 'vue';
  const user = reactive({
    name:'zhangsan',
    age:20
  });
  const stopWatch = watch(()=>user.name,(newValue,oldValue)=>{
    console.log('新数据:'+newValue,'-----旧数据:'+oldValue)
  })

  const onchangeName = ()=>{
    user.name = 'lisi';
  }

  const onchangeAge = ()=>{
    user.age = '22';
  }

</script>

<template>
  <div>
    <div>监听属性watch----{{user.name}}-----{{user.age}},</div>
    <button @click="onchangeName()">监听名字</button>
    <button @click="onchangeAge()">监听年龄</button>
  </div>
</template>

在这里插入图片描述
6、 watchEffect()
watchEffect也是用来监听数据的,刚进页面就会立即执行一次,同时响应式地追踪其依赖,并在依赖更改时重新执行该函数。
watch要明确指出监听的数据,watchEffect不用明确指定监视的数据,用到哪些属性,就会监听哪些属性。

<script setup>
  import { ref ,reactive, watch ,watchEffect } from 'vue';
  const num = ref(0);
  const user = reactive({
    name:'zhangsan',
    age:20
  });
  const stopWatch = watchEffect(()=>{
    console.log('数据发生变化:'+num.value,user.name)
  })

  const onchange = ()=>{
    num.value ++;
    user.name = 'zhangsan修改';
  }

</script>

<template>
  <div>
    <div>监听属性watch--{{num}}--{{user.name}}-----{{user.age}},</div>
    <button @click="onchange()">改变</button>

  </div>
</template>

在这里插入图片描述
7、停止监听
有的时候,我们可能只需要监听一次。在监听之后,我们就需要取消对watch的监听。此时我们可以这样做,将watch监听器赋值给一个变量,在取消监听的时候调用此变量即可。
要手动停止一个侦听器,请调用 watch 或 watchEffect 返回的函数:

<script setup>
  import { ref ,reactive, watch ,watchEffect } from 'vue';
  const num = ref(0);
  const stopWatch = watch(num,(newValue,oldValue)=>{
    console.log('新数据:'+newValue,'旧数据:'+oldValue)
    //停止监听
    if(newValue == 5)
      stopWatch()
  })

  const onchange = ()=>{
    num.value ++;
  }

</script>

在这里插入图片描述

二、计算属性computed
计算属性computed作用是根据已有数据计算出新数据。它需要返回一个值,返回的值就是该计算属性的值。
1、只读取

<script setup>
import { reactive, computed } from 'vue'

const author = reactive({
  name: 'zhangsan',
  books: [
    'Vue 2',
    'Vue 3',
    'Vue 4'
  ]
})

// 一个计算属性 ref
const BooksMessage = computed(() => {
  return author.books.length > 0 ? 'Yes' : 'No'
})
</script>

<template>
  <p>计算属性:</p>
  <span>{{ BooksMessage }}</span>
</template>

在这里插入图片描述
2、可写计算属性
计算属性默认是只读的。当你尝试修改一个计算属性时,你会收到一个运行时警告。只在某些特殊场景中你可能才需要用到“可写”的属性,你可以通过同时提供 getter 和 setter 来创建

<script setup>
  import { ref, computed } from 'vue'
  const age = ref(16)
  const newAge = computed({
    // get函数,获取计算属性的值
    get(){
      return age.value + 2
    },
    // set函数,当你给计算属性设置值的时候触发
    set (value) {
      age.value = value - 2
    }
  })
</script>

<template>
  <p>计算属性:</p>
  <div class="container">
    <div>今年:{{age}}</div>
    <div>后年:{{newAge}}</div>
    <input type="text" v-model="newAge">
  </div>
</template>

在这里插入图片描述
总结:
给computed传入函数,返回值就是计算属性的值
给computed传入对象,get获取计算属性的值,set监听计算属性改变。

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

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

相关文章

代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

860. 柠檬水找零 思路&#xff1a; 只需要维护三种金额的数量&#xff0c;5&#xff0c;10和20。 有如下三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10情况三&#xff1a;…

好友关注-实现分页查询收邮箱

9.5好友关注-实现分页查询收邮箱 需求&#xff1a;在个人主页的“关注”卡片中&#xff0c;查询并展示推送的Blog信息&#xff1a; 具体操作如下&#xff1a; 1、每次查询完成后&#xff0c;我们要分析出查询出数据的最小时间戳&#xff0c;这个值会作为下一次查询的条件 2…

考研党打印资料怎么使用云打印服务?

对于准备考研的同学们来说&#xff0c;在备考的时候需要准备许多资料&#xff0c;这些资料的打印费用成为了考研党的巨额支出。那么在生活费有限的情况下&#xff0c;考研党打印资料最好是选择云打印服务&#xff0c;因为易绘创云打印服务低至5分钱/页还包邮。那么考研党打印资…

Pytest精通指南(28)钩子函数-测试报告(pytest-html)

文章目录 前言应用场景插件安装参数分析使用方法拓展-定制化报告 前言 在软件开发过程中&#xff0c;测试是确保代码质量的关键环节。 而测试报告则是测试过程中不可或缺的输出物&#xff0c;它为我们提供了关于测试用例执行情况的详细信息&#xff0c;帮助我们快速定位和解决问…

服务器(AIX、Linux、UNIX)性能监视器工具【nmon】使用介绍

目录 ■nmon简介 1.安装 2.使用简介 3.使用&#xff08;具体使用的例子【CPU】【内存】&#xff09; 4.采集数据 5.查看log&#xff08;根据结果&#xff0c;生成报表&#xff09; 6.分析结果 ■nmon简介 nmon&#xff08;"Nigels performance Monitor"&…

比特币成长的代价

作者&#xff1a;Jeffrey Tucker&#xff0c;作家和总裁。曾就经济、技术、社会哲学和文化等话题广泛发表演讲。编译&#xff1a;秦晋 2017 年之后参与比特币市场的人遇到了与之前的人不同的操作和理想。如今&#xff0c;没有人会太在意之前的事情&#xff0c;说的是 2010-2016…

SL3038 耐压150V恒压芯片 60V降24V 72V降12V降压IC

SL3038 是一款恒压芯片&#xff0c;其耐压值为 150V。这意味着它可以在高达 150V 的电压下工作而不会损坏。现在&#xff0c;让我们来讨论您提到的两个降压应用&#xff1a;从 60V 降到 24V 和从 72V 降到 12V。 1. 60V 降到 24V&#xff1a; 输入电压&#xff1a;60V 输出电…

02 IO口的操作

文章目录 前言一、IO的概念1.IO接口2.IO端口 二、CPU和外设进行数据传输的方法1.程序控制方式1.1 无条件1.2 查询方式 2.中断方式3.DMA方式 一、方法介绍和代码编写1.前置知识2.程序方式1.1 无条件方式1.1.1 打开对应的GPIO口1.1.2 初始化对应的GPIO引脚1.1.2.1 推挽输出1.1.2.…

【Hadoop】-Hive部署[12]

目录 思考 VMware虚拟机部署 规划 步骤1&#xff1a;安装MySQL数据库 步骤2&#xff1a;配置Hadoop 步骤3&#xff1a;下载解压Hive 步骤4&#xff1a;提供MySQL Driver包 步骤5&#xff1a;配置Hive 步骤6&#xff1a;初始化元数据库 步骤7&#xff1a;启动Hive&…

TDSQL同一个所属Set显示3个备份节点

欢迎关注“数据库运维之道”公众号&#xff0c;一起学习数据库技术! 本期将为大家分享《TDSQL同一个所属Set显示3个备份节点》的处置案例。 关键词&#xff1a;分布式数据库、TDSQL、备份节点 1、问题描述 登录赤兔管理平台&#xff0c;单击左侧导航栏“实例管理/集群管理”…

漫谈-AI 时代的信息模型

模型化- 数字化转型的重要基石 在各行各业推行数字化转型过程中&#xff0c;构建信息化模型十分重要&#xff0c;它是数字化转型的基石。事实上&#xff0c;数字化转型的核心是“万物皆模型”&#xff0c;在工业领域&#xff0c;以德国为主导的工业4.0 发展进程中&#xff0c;…

Access denied for user ‘zabbix‘@‘localhost‘ (using password: NO)

现象 排查过程 进入数据库show grants for zabbixlocalhost;select host,user from mysql.user;cat /etc/zabbix/zabbix_server.conf | grep DB | grep -vE ‘#|$’cat /etc/zabbix/web/zabbix.conf.php | grep DB 解决办法 mysql 8.0以下 DPassword123.com mariadb -e "…

java多线程-并发和并行

进程 并发 进程中的线程是由CPU进行调度的&#xff0c;但是CPU能够处理的进程数量有限为了保证所有的线程都在运行&#xff0c;CPU会快速切换&#xff0c;给外界的感觉就是所有的线程都在运行&#xff0c;这就是并发。 并行

【力扣 Hot100 | 第六天】4.21(最长连续序列)

文章目录 10.最长连续序列10.1题目10.2解法&#xff1a;哈希法10.2.1哈希思路10.2.2代码实现 10.最长连续序列 10.1题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时…

php 编译安装oracel扩展

第一步安装Oracle客户端 1&#xff0c;需要下载基础包和sdk oracle客户端下载链接&#xff1a;Oracle Instant Client Downloads for Linux x86-64 (64-bit) https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html 选择最新版本 versi…

国产PLC有哪些,哪个牌子比较好用?

你知道国产PLC有哪些吗,哪个牌子更好用吗&#xff1f; 今天拿出国产先锋的汇川与台达对比&#xff0c;注&#xff1a;视频后方有各品牌学习资料免费送&#xff0c;需要的移步自取。话说回来&#xff0c;只要基于Codesys开发的都比较好用&#xff0c;只是使用底层芯片不同&…

2013-2021年各省经济韧性相关测度指标面板数据

2013-2021年各省经济韧性相关测度指标面板数据 1、时间&#xff1a;2013-2021年 2、指标&#xff1a;城镇化率 %、财政科学技术支出&#xff08;亿元&#xff09;、万人高等教育在校人数&#xff08;万人&#xff09;、财政教育支出&#xff08;亿元&#xff09;、第三产业占…

AD 21、22 软件安装教程

AD2022安装包链接 链接&#xff1a;https://pan.baidu.com/s/1oMNbXibQ1Zjl0RTLdPDVGw 提取码&#xff1a;xfs4 软件下载 1.以管理员身份运行 2. 3. 4. 5.路径最好改为C盘以外的&#xff0c;如D盘&#xff0c;要新建一个空文件夹 6. 7.下载好以后 8.在Crack文件夹下找…

程序员周末提升计划:朝网络安全工程师转型之路

作为一名软件开发人员&#xff0c;我一直对网络安全充满兴趣&#xff0c;并希望在未来转型成为一名网络安全工程师。面对网络安全领域的挑战和机遇&#xff0c;我制定了一个周末提升计划&#xff0c;希望能系统地增强我的技能并为这一跨界做好准备。下面&#xff0c;我将分享我…

有没有学网络空间安全的学长,想知道学长们毕业以后都去干嘛了?

我作为一个零基础小白到白帽黑客&#xff0c;也认识到了很多零基础小白的&#xff0c;有一些网络空间安全的学员&#xff0c;但是大多数还是非计算机相关专业的学员。他们通过系统学习网络安全&#xff0c;掌握黑客技术之后&#xff0c;都找到了自己满意的工作。 同学A&#x…