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

news2024/12/28 19:12:49

监听属性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.coloradmin.cn/o/1621414.html

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

相关文章

如何用stata画出文献中常见的安慰剂检验图?如何解决

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Twisted 与 Tornado 中的 WebSocket 连接问题及解决方案

1、问题背景 项目中我们需要通过 Tornado HTTP 处理程序建立WebSocket连接&#xff0c;该连接需要处理多个用户请求&#xff0c;并且将从外部服务器获取的数据存储到数据库中。我们尝试了以下实现&#xff1a; from twisted.internet import reactor from autobahn.websocket…

R可视化:ggplot2绘制双y轴图

介绍 ggplot2绘制双y轴图加载R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE) library(tidyverse) library(readxl)# rm(list = ls()) options(stringsAsFactors = F) options(future.globals.maxSize = 10000 * 1024^2)Importing data 下载Underdetection of c…

【性能测试】ChaosTesting(混沌测试)ChaosBlade(混沌实验工具)(六)-servelt

7. servelt接口规范 7.0 创建servelt blade create servlet 7.0.1 介绍 Servlet 是 Java 的 web 的接口规范&#xff0c;Java web 服务器都遵循此规范实现。本场景主要模拟 Java Web 请求延迟、异常场景。 [blade create servlet delay](blade create servlet delay.md) 请…

【网安小白成长之路】9.sql注入操作

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

Vue:vue的工程化

Vue前端工程化 前后端分离开发 即前端人员开发前端工程,将开发好的前端工程打包部署在前端服务器上 后端开发人员开发后端工程,再将后端工程打包部署在后端服务器上,这种模式称为前后端分离开发 而前后端要顺利对接的关键就是要遵循一定的开发规范 开发规范 这种开发规范定…

STC8H8K64U I2C主机模式相关寄存器

STC8H8K64U I2C主机模式相关寄存器 STC8H8K64U-TSSOP20 I2CCFG I2C配置寄存器 I2CMSCR I2C主机控制寄存器 I2CMSST I2C主机状态寄存器 I2CMSAUX I2C主机辅助控制寄存器 I2CTXD I2C数据发送寄存器 I2CRXD I2C数据接收寄存器 I2CCFG I2C配置寄存器 B7ENI2C ENI2C&#xff1a…

【题解】NowCoder DP4 最小花费爬楼梯

题目来源&#xff1a;牛客 DP4 最小花费爬楼梯 题目描述&#xff1a; 给定一个整数数组 cost &#xff0c; 其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用&#xff0c;下标从 0 开始。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从…

Bayes判别示例数据:鸢尾花数据集

使用Bayes判别的R语言实例通常涉及使用朴素贝叶斯分类器。朴素贝叶斯分类器是一种简单的概率分类器&#xff0c;基于贝叶斯定理和特征之间的独立性假设。在R中&#xff0c;我们可以使用e1071包中的naiveBayes函数来实现这一算法。下面&#xff0c;我将通过一个简单的示例展示如…

多目标果蝇算法及其MATLAB实现

果蝇算法最早的文献是由台湾华夏科技大学的潘文超教授于2011年提出来的。该算法是基于果蝇觅食行为的仿生学原理而提出的一种新兴群体智能优化算法&#xff0c;被称为果蝇优化算法(Fruit Fly Optimization Algorithm, FOA)。通过模拟果蝇利用敏锐的嗅觉和视觉进行捕食的过程&am…

JTS:Java Topology Suit

接口文档:org.locationtech.jts:jts-core 1.19.0 API。 开发文档:JTS | Documentation。 概述 JTS提供了平面线性几何(planar and linear geometry)与相关的基础几何处理函数(a set of fundamental geometric functions.)。 JTS遵循OGC发布的简单几何规范(Simple Featu…

docker 基本命令

目录 一、docker 镜像操作命令 1.1.查询软件镜像 1.2.docker pull&#xff1a;下载镜像 1.3.docker push&#xff1a;上传镜像 1.4.docker images&#xff1a;查看本地镜像 1.5.docker inspect &#xff1a;获取镜像详细信息 1.6.docker tag&#xff1a;添加镜像标签 …

attempt to compare nil with number -- 黑马点评出现问题

问题情况 : 主要问题 : 调用lua执行redis时&#xff0c;有一个值会接受nil&#xff08;因为redis中没有该数据&#xff09;或者数值&#xff0c;当该值为nil时执行报错&#xff0c;因为会用到将该值与其他数字比较&#xff0c;故报错attempt to compare nil with number 当然…

【uniapp】引入uni-ui组件库

&#xff08;1&#xff09;新建项目的时候选择 uni-ui项目 &#xff08;2&#xff09;已经创建好的项目去官网单独安装 跳转单独安装组件 https://uniapp.dcloud.net.cn/component/uniui/quickstart.html#%E9%80%9A%E8%BF%87-uni-modules-%E5%8D%95%E7%8B%AC%E5%AE%89%E8%A3%8…

详细分析mysqlslap的基本知识 | 压力测试(附Demo)

目录 前言1. 基本知识2. 参数解读2.1 auto-generate-sql2.2 only-print2.3 iterations2.4 并发处理参数 前言 对数据库进行压力测试&#xff0c;对此补充这方面的详细知识点 1. 基本知识 mysqlslap 是 MySQL 自带的用于模拟数据库负载的压力测试工具 可以模拟多个客户端并发…

基于51单片机的矩阵按键扫描的proteus仿真

文章目录 一、按键按键按键消抖 二、独立按键仿真图仿真程序 三、矩阵按键仿真图仿真程序 四、总结 一、按键 按键 按键通常指的是电子设备上的一种输入装置&#xff0c;用于在按下时发送信号&#xff0c;以便设备执行相应的操作。按键可以分为独立按键和矩阵按键两种类型。 …

10.Java集合汇总

文章目录 1. Java集合概述1.1 Java集合框架概述1.2 Collection接口继承树1.3 Map接口继承树 2. Collection接口2.1 Collection接口方法 3 Iterator迭代器接口3.1 Iterator接口的方法3.2 foreach循环 4 List接口4.1 List接口方法4.1 ArrayList4.2 LinkedList4.3 Vector4.4 面试题…

free 命令示例

目录 ⛳️推荐 前言 Linux 中如何使用 free 命令 1、以人类可读的形式显示信息 2、连续显示统计数据 3、定义显示统计数据的次数 4、指定输出数据类型 5、获取物理内存和交换内存的总和 总结 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

[MYSQL索引优化] 分页查询优化

这里一共介绍两种常见的分页索引优化技巧,let go! 示例表: CREATE TABLE t_product (id int(0) NOT NULL,pname varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,price double(7, 2) NULL DEFAULT 0.00,promoteSales varchar(200) CHARA…

5分钟搞懂词向量生成技术:Word2Vec

大家好啊&#xff0c;我是董董灿。 今天我们来简单聊一个在自然语言处理&#xff08;NLP&#xff09;中非常有用的技术——Word2Vec。 之前曾经写过一些关于文本处理的基础知识&#xff0c;包括判断两个文本是否相似&#xff0c;可以使用余弦相似度&#xff0c;但在此之前&am…