Vue3的Composition组合式API(computed计算属性、watch监视属性、watchEffect函数)

目录

  • 1. computed计算属性
  • 2. watch监视属性
    • 2.1 watch监视ref定义的数据
    • 2.2 watch监视reactive定义的数据
  • 3. watchEffect函数

1. computed计算属性

与Vue2中的computed配置功能一致。使用示例如下:

  1. Student.vue
  • 计算属性的简写只能进行读取;完整写法有get和set能进行读写
  • 能读取姓和名,姓和名能构成全名
  • 修改姓或名,全名也一起修改
  • 修改全名,姓或名也一起修改
<template><div>姓:<input type="text" v-model="person.firstName"></div><div>名:<input type="text" v-model="person.lastName"></div><div>全名:<input type="text" v-model="person.fullName"></div>
</template><script>
import {reactive,computed} from 'vue'export default {name: 'Student',setup(){let person = reactive({firstName:'张',lastName:'三'})// 计算属性-简写:只能读取/* person.fullName = computed(()=>{return person.firstName + '-' + person.lastName}) */// 计算属性——完整写法: 可以读写person.fullName = computed({get(){return person.firstName + '-' + person.lastName},set(value){const arr = value.split('-')person.firstName = arr[0]person.lastName = arr[1]}})return {person}}
}
</script>
  1. App.vue
<template><Student/>
</template><script>import Student from './components/Student'export default {name: 'App',components: {Student}}
</script>
  1. 页面如下。给姓添加123,全名同步修改。给全名添加456,名同步修改
    computed计算属性效果

2. watch监视属性

与Vue2中watch配置功能一致

2.1 watch监视ref定义的数据

Student.vue

  • 情况一:监视ref所定义的一个基础类型数据
    • immediate开启时初始化就会调用一下
    • 使用watch监视一个属性多次,监视回调函数就会调用多次
  • 情况二:监视ref所定义的多个基础类型数据
  • 情况三: 监视ref所定义的一个对象类型数据。对象内的属性发生改变不能监视到
    • 监视方式一: 使用person.value,这样监视的不是RefImpl,而是Proxy。这种也能深度监视
    • 监视方式二: 使用配置参数{deep:true}开启深度监视
    • 监视问题: 监视的oldValue和newValue一样
<template><h2>当前sum为:{{sum}}</h2><button @click="sum++">点我sum+1</button><hr><h2>当前的信息为:{{msg}}</h2><button @click="msg+='!'">修改信息</button><hr><h2>姓名:{{person.name}}</h2><h2>薪资:{{person.job.salary}}K</h2><button @click="person.name+='~'">修改姓名</button><button @click="person.job.salary++">涨薪</button>
</template><script>import {ref,watch} from 'vue'export default {name: 'Student',setup(){let sum = ref(0)let msg = ref('你好啊')let person = ref({name:'张三',job:{salary:20}})// 情况一:监视ref所定义的一个基础类型数据。immediate开启时初始化就会调用一下// 使用watch监视一个属性多次,监视回调函数就会调用多次watch(sum,(newValue,oldValue)=>{console.log('sum变了',newValue,oldValue)},{immediate:true})// 情况二:监视ref所定义的多个基础类型数据watch([sum,msg],(newValue,oldValue)=>{console.log('sum或msg变了',newValue,oldValue)})// 情况三: 监视ref所定义的一个对象类型数据。对象内的属性发生改变不能监视到// 监视方式一: 使用person.value,这样监视的不是RefImpl,而是Proxy。这种也能深度监视// 监视方式二: 使用配置参数{deep:true}开启深度监视// 监视问题: 监视的oldValue和newValue一样watch(person.value,(newValue,oldValue)=>{console.log('person变化了',newValue,oldValue)},{deep:true})return {sum,msg,person}}
}
</script>

效果如下:

  1. 初次访问页面,监视sum的immdiate为true生效
  2. 点我sum+1,由于sum被监视了两次,所以监视回调函数调用两次
  3. 点修改信息,能监视到
  4. 点修改姓名,能监视到。但oldValue和newValue一样
  5. 点涨薪,能深度监视到。但oldValue和newValue一样
    watch监视ref定义的数据

2.2 watch监视reactive定义的数据

Student.vue

  • 情况一:监视reactive所定义的一个响应式数据的全部属性
    • 注意1:获取的oldValue和newValue一样
    • 注意2:强制开启了深度监视,deep配置无效
  • 情况二:监视reactive所定义的一个响应式数据中的某个属性
    • 注意1: 能正常获取到oldValue和newValue
  • 情况三:监视reactive所定义的一个响应式数据中的多个属性。此时newValue和oldValue都是数组
  • 情况四:监视reactive所定义的一个响应式数据中的某个深度对象类型属性
    • 注意1: 获取的oldValue和newValue一样
    • 注意2: 修改对象里面的内部属性,需要开启{deep:tree}才能监测到
<template><h2>姓名:{{person.name}}</h2><h2>姓名:{{person.age}}</h2><h2>薪资:{{person.job.salary}}K</h2><button @click="person.name+='~'">修改姓名</button><button @click="person.age+=1">修改年龄</button><button @click="person.job.salary++">涨薪</button>
</template><script>import {reactive,watch} from 'vue'export default {name: 'Student',setup(){let person = reactive({name:'张三',age:18,job:{salary:20}})// 情况一:监视reactive所定义的一个响应式数据的全部属性//    注意1:获取的oldValue和newValue一样//    注意2:强制开启了深度监视,deep配置无效/* watch(person,(newValue,oldValue)=>{console.log('person变化了',newValue,oldValue)}) */// 情况二:监视reactive所定义的一个响应式数据中的某个属性//    注意1: 能正常获取到oldValue和newValuewatch(()=>person.name,(newValue,oldValue)=>{console.log('person的name变化了',newValue,oldValue)})// 情况三:监视reactive所定义的一个响应式数据中的多个属性。此时newValue和oldValue都是数组watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{console.log('person的name或age变化了',newValue,oldValue)})// 情况四:监视reactive所定义的一个响应式数据中的某个深度对象类型属性//    注意1: 获取的oldValue和newValue一样//    注意2: 修改对象里面的内部属性,需要开启{deep:tree}才能监测到watch(()=>person.job,(newValue,oldValue)=>{console.log('person的job变化了',newValue,oldValue)},{deep:true})return {person}}
}
</script>

效果如下:

  1. 点修改姓名,能监视到。且监视两次所以监视回调函数执行两次。能正常获取到oldValue和newValue
  2. 点涨薪,能深度监视到。但oldValue和newValue一样
    watch监视reactive定义的数据

3. watchEffect函数

  • 不用指明监视哪个属性,监视的回调中用到哪个属性,这个属性改变就会自动执行监视回调函数
  • watchEffect更注重的是回调函数的执行过程,所以不用写返回值

使用示例

<template><h2>薪资:{{person.job.salary}}K</h2><button @click="person.job.salary++">涨薪</button>
</template><script>import {reactive,watchEffect} from 'vue'export default {name: 'Student',setup(){let person = reactive({job:{salary:20}})watchEffect(()=>{person.job.salaryconsole.log('watchEffect所指定的回调执行了')})return {person}}
}
</script>

效果如下。点击涨薪,person.job.salary发生变化,就会自动调用watchEffect的回调函数
watchEffect函数效果

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

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

相关文章

【vivado】vivado联合modelsim仿真

操作步骤 1 编译Vivado仿真库2 设置仿真工具和库路径3 启动modelsim仿真 1 编译Vivado仿真库 等待编译完成。 2 设置仿真工具和库路径 打开vivado工程文件&#xff0c; 点击tool–>Setting 更改编译器为modelsimulator&#xff0c;并悬着编译库文件 3 启动modelsim仿真…

整理—MySQL

目录 NOSQL和SQL的区别 数据库三大范式 MySQL 怎么连表查询 MySQL如何避免重复插入数据&#xff1f; CHAR 和 VARCHAR有什么区别&#xff1f; Text数据类型可以无限大吗&#xff1f; 说一下外键约束 MySQL的关键字in和exist mysql中的一些基本函数 SQL查询语句的执行顺…

Java爬虫:从入门到精通实战指南

在信息技术飞速发展的今天&#xff0c;数据已成为最宝贵的资源之一。Java作为一种成熟且功能强大的编程语言&#xff0c;不仅在企业级应用开发中占据主导地位&#xff0c;也成为了编写爬虫程序的理想选择。Java爬虫能够自动化地从网页或API中提取数据&#xff0c;为数据分析、机…

如何利用边缘计算网关进行工厂设备数据采集?天拓四方

边缘计算网关集成了数据采集、处理和传输功能&#xff0c;位于传感器和执行器组成的设备层与云计算平台之间。它能够实时处理和响应本地设备的数据请求&#xff0c;减轻云平台的压力&#xff0c;提高数据处理的速度和效率。同时&#xff0c;边缘计算网关还可以将处理后的数据上…

第J2周:ResNet50V2算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.ResNetV2结构与ResNet结构对比 &#x1f9f2; 改进点&#xff1a;(a)original 表示原始的 ResNet 的残差结构&#xff0c;(b)proposed 表示新的 ResNet 的残…

【HTML + CSS 魔法秀】打造惊艳 3D 旋转卡片

HTML结构 box 类是整个组件的容器。item-wrap 类是每个旋转卡片的包装器&#xff0c;每个都有一个内联样式–i&#xff0c;用于控制动画的延迟。item类是实际的卡片内容&#xff0c;包含一个图片。 <template><div class"box"><div class"item…

【完-网络安全】Windows防火墙及出入站规则

文章目录 防火墙入站和出站的区别域网络、专用网络、公用网络的区别 防火墙 防火墙默认状态一般是出站允许&#xff0c;入站阻止。 入站和出站的区别 入站就是别人来访问我们的主机&#xff0c;也就是正向shell的操作 出站就是反向shell&#xff0c;主机需要主动连接kali&am…

机器学习—特性缩放

特性缩放的技术能使梯度下降运行得更快&#xff0c;让我们先来看看功能大小之间的关系&#xff0c;这就是该特性的数字和相关参数的大小&#xff0c;作为一个具体的例子&#xff0c;让我们用两个特征来预测房子的价格&#xff0c;X1代表一个房子的大小&#xff0c;X2代表两个卧…

【黑马点评优化】之使用Caffeine+Redis实现应用级二层缓存

【黑马点评优化】之使用CaffeineRedis实现应用级二层缓存 1 缓存雪崩定义及解决方案2 为什么要使用多级缓存3 RedisCaffeine实现应用层二级缓存原理4 利用CaffeineRedis解决Redis突然宕机导致的缓存雪崩问题4.1 pom.xml文件引入相关依赖4.2 本地缓存配置类4.3 修改ShopServiceI…

UE5 使用Animation Budget Allocator优化角色动画性能

Animation Budget Allocator是UE内置插件&#xff0c;通过锁定动画系统所占CPU的预算&#xff0c;在到达预算计算量时对动画进行限制与优化。 开启Animation Budget Allocator需要让蒙皮Mesh使用特定的组件&#xff0c;并进行一些编辑器设置即可开启。 1.开启Animation Budget…

Tailwind Starter Kit 一款极简的前端快速启动模板

Tailwind Starter Kit 是基于TailwindCSS实现的一款开源的、使用简单的极简模板扩展。会用Tailwincss就可以快速入手使用。Tailwind Starter Kit 是免费开源的。它不会在原始的TailwindCSS框架中更改或添加任何CSS。它具有多个HTML元素&#xff0c;并附带了ReactJS、Vue和Angul…

k8s中的微服务

一、什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service&#xff0c;应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…

二叉树与堆讲解

目录 1.树的概念及结构 1.树的概念 2.树的相关概念 3.树的表示 2.二叉树 1.概念 2.特殊的二叉树 1.满二叉树 2.完全二叉树 3.二叉树的性质 4.二叉树的存储结构 1.顺序结构 2.链式存储 3.堆 1.堆的概念及结构 2.堆的实现 1.堆的创建 2.堆的初始化&#xff08;H…

Spring Boot知识管理:跨平台集成方案

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

STM32 407 RS485通信实现数据收发【我的创作纪念日】

1. 前言 本例中的485驱动&#xff0c;基于标准库编写&#xff0c;不是HAL库&#xff0c;请大家注意。 最近搞嵌入式程序&#xff0c;踩了不少坑&#xff0c;这里统一记录一下。 2. 收获 1.串口通信&#xff0c;数据是一个字节一个字节的发送&#xff0c;对方收到的数据是放在…

【消息队列】Kafka从入门到面试学习总结

国科大学习生活&#xff08;期末复习资料、课程大作业解析、大厂实习经验心得等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&…

小米电机与STM32——CAN通信

背景介绍&#xff1a;为了利用小米电机&#xff0c;搭建机械臂的关节&#xff0c;需要学习小米电机的使用方法。计划采用STM32驱动小米电机&#xff0c;实现指定运动&#xff0c;为此需要了解他们之间的通信方式&#xff0c;指令写入方法等。花了很多时间学习&#xff0c;但网络…

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…

类和对象的认识

类&#xff1a;类是用来描述一个对象的&#xff0c;在java中万物皆对象&#xff0c;通过对类的抽象&#xff0c;类有哪些属性和行为&#xff0c;将这些抽象出来就是类。比如&#xff1a;狗&#xff0c;有名字&#xff0c;年龄&#xff0c;要吃饭的行为等等&#xff0c;将这些动…

仓储管理系统原型图移动端(WMS),出入库管理、库存盘点、库存调拨等(Axure原型、Axure实战项目)

仓储管理系统原型图移动端 Warehouse Management System Prototype 仓储管理系统原型图移动端是一个以图形化方式展示系统移动端界面和功能的原型设计图。原型图展示和说明系统移动端的功能和界面布局&#xff0c;为相关利益方提供一个直观的视觉化展示&#xff0c;帮助他们更…