Vue学习计划-Vue3--核心语法(三)computed计算属性、watch监听、watchEffect函数

news2024/11/26 18:25:53
1. computed计算属性

作用:根据已有数据计算出新数据(和Vue2中的computed作用一致)。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. watch监视与watchEffect
1. watch
  • 作用:监视数据的变化(和Vue2watch作用一致)
  • 特点:Vue3中的watch只能监视以下4种数据:
  1. ref定义的数据
  2. reactive定义的数据
  3. 函数返回一个值(getter函数)
  4. 一个包含上述内容的数组

我们在Vue3中使用watch的时候,通常会遇到以下几种情况:

  1. 情况一

监视ref定义的【基本类型】数据:直接写数据名即可,监视的是其value值的改变

<template>
  <div>
    <h1>情况一:监视【ref】定义的【基本类型】数据</h1>
    <h2>姓名:{{ name }}</h2>
    <h2>年龄:{{ age }}</h2>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">修改年龄</button>
  </div>
</template>

<script lang="ts" setup name="Person234">
import {ref, watch} from 'vue'
let name = ref('张三')
let age = ref(0)

function changeName(){
  name.value += '~'
}

function changeAge(){
  age.value += 1
}

watch(name, (nv, oldv)=>{
  console.log('名字变了', nv, oldv)
})
// 监视,情况一:监视【ref】定义的【基本类型】数据
// 返回一个函数,当年龄等于5以后,停止监视,即调用返回函数即可
const stopWatch = watch(age, (nv, oldv)=>{
  console.log('年龄变了', nv, oldv)
  if(nv === 5){
    stopWatch()
  }
})

// 监视两个数据
// watch([name, age], (nv, oldv)=>{
//   console.log('数据变了', nv, oldv)
// })

</script>
  1. 情况二

监视ref定义的【对象类型】数据:直接写数据名,监视的是对象的【地址值】,若想监视对象内部的数据,要手动开启深度监视

注意:

  • 若修改的是ref定义的对象中的属性,newValue和oldValue都是新值,因为它们是同一个对象
  • 若修改整个ref定义的对象,newValue是新值,oldValue是旧值,因为不是同一个对象了
<template>
  <div>
    <h1>情况二:监视【ref】定义的【对象类型】数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changePerson">修改人</button>
  </div>
</template>

<script lang="ts" setup name="Person234">
import {ref, watch} from 'vue'
let person = ref({
  name: '张三',
  age: 19
})

function changeName(){
  person.value.name += '~'
}

function changeAge(){
  person.value.age += 1
}

function changePerson(){
  person.value = { name: '李四', age: 90}
}


/* 监视,情况二:监视【ref】定义的【对象类型】数据,监视的是对象的地址值,若想监视对象内部的属性,需要收到开启深度监视
  watch的第一个参数是:被监视的数据
  watch的第二个参数是:监视的回调
  watch的第三个参数是:配置对象(deep,immediate等等..)
*/
watch(person, (nv, oldv)=>{
  console.log('名字变了', nv, oldv)
}, {deep:true, immediate: true})

</script>
  1. 情况三

监视reactive定义的【对象类型】数据, 默认开启深度监视

<template>
  <div>
    <h1>情况三:监视【reactive】定义的【对象类型】数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changePerson">修改人</button>
  </div>
</template>

<script lang="ts" setup name="Person234">
import {reactive, watch} from 'vue'
let person = reactive({
  name: '张三',
  age: 19
})

function changeName(){
  person.name += '~'
}

function changeAge(){
  person.age += 1
}

function changePerson(){
  person = Object.assign(person, { name: '李四', age: 90})
}


  // 监视,情况三:监视【reactive】定义的【对象类型】数据,且默认是开启深度监视的
watch(person, (nv, oldv)=>{
  console.log('名字变了', nv, oldv)
})

</script>
  1. 情况四

监视refreactive定义的【对象类型】数据的某个属性, 注意如下:

  1. 若该属性值不是【对象类型】,需写成函数形式
  2. 若该属性值是【对象类型】,可直接编写,也可以写成函数,建议写成函数

结论:监视的要是对象里的属性,那么最后写函数式,注意点:若是对象监视的是地址值,需要关注对象内部,需要手动开启深度监视

<template>
  <div>
    <h1>情况三:监视【reactive】定义的【对象类型】数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <h2>第一量车:{{ person.car.c1 }}</h2>
    <h2>第二量车:{{ person.car.c2 }}</h2>
    <h2>车信息:{{ person.car.c1 }} - {{ person.car.c2 }}</h2>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changeC1">修改第一量车</button>
    <button @click="changeC2">修改第二量车</button>
    <button @click="changeCar">修改车</button>
  </div>
</template>

<script lang="ts" setup name="Person234">
import {reactive, watch} from 'vue'
let person = reactive({
  name: '张三',
  age: 19,
  car: {
    c1: '奔驰',
    c2: '宝马'
  }
})

function changeName(){
  person.name += '~'
}

function changeAge(){
  person.age += 1
}

function changeC1(){
  person.car.c1 = '吉利'
}
function changeC2(){
  person.car.c2 = '奇瑞'
}
function changeCar(){
  person.car = {c1: '哈佛', c2: '长安'}
}

// 监视,情况四:若该属性值不是【对象类型】,需写成函数形式
watch(()=> person.name, (nv, oldv)=>{
  console.log('名字变了', nv, oldv)
})

// 监视,情况四:若该属性值是【对象类型】,可以直接编写
// 因为reactive定义的响应式对象person,所以car也是响应式对象,那么监视person.car就相当于reactive定义的一个car,默认开启深度监视,当修改c1和c2的时候,会监视到,但是当修改整个car,就相当于car的指针换了地址,原对象不变,所以changeCar不会触发监视,所以建议写成函数
// watch(person.car, (nv, oldv)=>{
//   console.log('车变了', nv, oldv)
// })

// 监视,情况四:若该属性值是【对象类型】,建议写成函数 
// 函数返回值是car的空间地址,对空间地址进行监视,则修改car的指针,会触发,但是内部属性变化,不会触发, 需要手动开启深度监听
watch(()=>person.car, (nv, oldv)=>{
  console.log('车变了', nv, oldv)
},{ deep: true})
</script>
  1. 情况五

监视上述的多个数据

// watch([()=>person.name, ()=>person.car], (nv)=>{
//   console.log('车变了', nv)
// },{ deep: true})
// 或者
watch([()=>person.name, person.car], (nv)=>{
  console.log('车变了', nv)
},{ deep: true})
2. watchEffect
  • 官网:立即运行一个函数,同时响应式的追踪其依赖,并在依赖更改时重新执行该函数
  • watch对比watchEffect
  1. 都能监听响应式数据的变化,不同的是监听数据变化的方式不同
  2. watch:要明确指出监视的数据
  3. watchEffect: 不用明确指出监视的数据(函数中用到哪些属性,那就监视哪些属性)
  • 示例代码:
<template>
  <div>
    <h1>当温度高于60或者高度高于20,调取接口</h1>
    <h2>温度:{{ temp }}</h2>
    <h2>高度:{{ height }}</h2>
    <button @click="changeTemp">修改温度</button>
    <button @click="changeHeight">修改高度</button>
  </div>
</template>
<script lang="ts" setup name="Person234">
import {ref, watch, watchEffect} from 'vue'
let temp = ref(0)
let height = ref(0)
function changeTemp(){
  temp.value += 10
}
function changeHeight(){
  height.value += 10
}
// 使用watch,需要指定监视谁
// watch([temp, height], (nv)=>{
//   const [temp, height] = nv
//   if(temp >= 60 || height>=80){
//     console.log('调取接口')
//   }
// })

 // 用watchEffect实现,不用
const stopWatch = watchEffect(()=>{
  if(temp.value >= 60 || height.value >= 20){
    console.log('调取接口', temp.value, height.value )
  }
  if(temp.value === 100 || height.value === 50){
    console.log('停止监视', temp.value, height.value )
    stopWatch()
  }

})

</script>

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

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

相关文章

Flume基础知识(五):Flume实战之实时监控目录下多个新文件

1&#xff09;案例需求&#xff1a; 使用 Flume 监听整个目录的文件&#xff0c;并上传至 HDFS 2&#xff09;需求分析&#xff1a; 3&#xff09;实现步骤&#xff1a; &#xff08;1&#xff09;创建配置文件 flume-dir-hdfs.conf 创建一个文件 vim flume-dir-hdfs.conf …

一起学docker(六)| Dockerfile自定义镜像 + 微服务模块实战

DockerFile 是什么 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 构建步骤 编写Dockerfile文件docker build命令构建镜像docker run运行镜像 Dockerfile构建过程 基础知识 每个保留字指令都必须为大写字母且后面…

逻辑回归(LR)----机器学习

基本原理 逻辑回归&#xff08;Logistic Regression&#xff0c;LR&#xff09;也称为"对数几率回归"&#xff0c;又称为"逻辑斯谛"回归。 logistic回归又称logistic 回归分析 &#xff0c;是一种广义的线性回归分析模型&#xff0c;常用于数据挖掘&#…

『年度总结』逐梦编程之始:我的2023学习回顾与展望

目录 这篇博客&#xff0c;我将回顾2023年编程之旅的起点&#xff0c;同时展望2024年的新征程。 前言 我与Python 我与C语言 第一篇正式博客&#xff1a; 第二篇正式博客&#xff08;扫雷&#xff09;&#xff1a; 指针学习笔记: C语言学习笔记&#xff1a; 我与数据结构…

SCT52A40——120V,4A,高频高压侧和低压侧栅极驱动器,替代UCC27200/UCC27201/MIC4604YM等

• 8-24V宽供电电压 • 驱动高侧和低侧N通道MOSFET • 4A峰值输出源电流和汇电流 • 升压电源电压范围可达120V • 集成阴极负载二极管 • TTL兼容输入&#xff0c;-10V输入 • 45ns传输延迟 • 1000pF负载下7ns上升和4.5ns下降时间 • 2ns延迟匹配时间 • 静态电流252uA • 15…

JDK、JRE、JVM的联系与区别

JDK、JRE、JVM的联系与区别 一、JDK,JRE,JVM定义 JDK(Java Development Kit),包含JRE,以及增加编译器和调试器等用于程序开发的文件。 JRE(Java Runtime Environment)&#xff0c;包含Java虚拟机、库函数、运行Java应用程序所必须的文件。 JVM(Java Virtual Machine)是一个虚…

Vue中的选项式 API 和组合式 API,两者有什么区别

Vue中的选项式 API&#xff08;Option API&#xff09;和组合式 API&#xff08;Composition API&#xff09;是两种不同的组件编写方式&#xff0c;它们各有特点和适用场景&#xff1a; 选项式 API&#xff08;Option API&#xff09;: 传统方法&#xff1a;Vue最初的编程范式…

LeetCode 热题 100——42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

一起玩儿物联网人工智能小车(ESP32)——25. 利用超声波传感器测量距离

摘要&#xff1a;本文介绍如何利用超声波传感器测量障碍物的距离 测量距离是智能小车经常要用到的功能&#xff0c;今天就来介绍一个最常用的测量距离的传感器——超声波传感器。 超声波传感器的测距原理是利用超声波发射器向某个方向发射超声波&#xff0c;与此同时&#xff…

Health System Pro - Plug Play Solution

Health System为您提供了可重复使用的健康组件、健康条和碰撞块组件&#xff0c;可以轻松定制和扩展&#xff0c;以满足任何项目的需求。通过使用Health System&#xff0c;您可以节省时间和精力&#xff0c;避免为每个项目或游戏实体重写健康逻辑&#xff0c;从而带来更高效的…

计算机网络(9):无线网络

无线局域网 WLAN 无线局域网常简写为 WLAN (Wireless Local Area Network)。 无线局域网的组成 无线局域网可分为两大类。第一类是有固定基础设施的&#xff0c;第二类是无固定基础设施的。所谓“固定基础设施”是指预先建立起来的、能够覆盖一定地理范围的一批固定基站。 …

Python----matplotlib库

目录 plt库的字体&#xff1a; plt的操作绘图函数&#xff1a; plt.figure(figsizeNone, facecolorNone): plt.subplot(nrows, ncols, plot_number)&#xff1a; plt.axes(rect)&#xff1a; plt.subplots_adjust(): plt的读取和显示相关函数&#xff1a; plt库的基础图…

Day22 二叉树part08 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

二叉树part08 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 235. 二叉搜索树的最近公共祖先 方法一&#xff1a;递归法&#xff08;利用二叉搜索树性质&#xff09; class Solution { public:TreeNode* lowestCommonAncestor(TreeN…

74HC595驱动数码管程序

数码管的驱动分静态扫描和动态扫描两种&#xff0c;使用最多的是动态扫描&#xff0c;优点是使用较少的MCU的IO口就能驱动较多位数的数码管。数码管动态扫描驱动电路很多&#xff0c;其中最常见的是74HC164驱动数码管&#xff0c;这种电路一般用三极管作位选信号&#xff0c;用…

管理组件状态

概述 在应用中&#xff0c;界面通常都是动态的。如图1所示&#xff0c;在子目标列表中&#xff0c;当用户点击目标一&#xff0c;目标一会呈现展开状态&#xff0c;再次点击目标一&#xff0c;目标一呈现收起状态。界面会根据不同的状态展示不一样的效果。 图1 展开/收起目标…

50、实战 - 利用 conv + bn + relu + add 写一个残差结构

上一节介绍了残差结构&#xff0c;还不清楚的同学可以返回上一节继续阅读。 到了这里&#xff0c;一个残差结构需要的算法基本都介绍完了&#xff0c;至少在 Resnet 这种神经网络中的残差结构是这样的。 本节我们做一个实战&#xff0c;基于之前几节中手写的 conv / bn 算法&…

python封装接口自动化测试套件 !

在Python中&#xff0c;我们可以使用requests库来实现接口自动化测试&#xff0c;并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例&#xff1a; 首先&#xff0c;我们需要安装所需的库&#xff1a; pip install requests …

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的志愿者…

大数据毕业设计:旅游景点数据爬虫大屏实时监控系统✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

山海鲸可视化软件的优势:数据整合、可视化与个性化定制

随着科技的快速发展&#xff0c;企业数字化转型已成为必然趋势。而对于一些本身没有开发优势或非技术型企业&#xff0c;数字化产品的选择就成为重中之重。作为山海鲸可视化软件的开发者&#xff0c;我们深知这一点&#xff0c;对于企业来说&#xff0c;能选择一个产品一定要有…