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,一经查实,立即删除!

相关文章

Vue 之 插件与组件的区别

在 Vue.js 中&#xff0c;插件&#xff08;Plugin&#xff09;和组件&#xff08;Component&#xff09;都是用来扩展 Vue 功能的重要工具&#xff0c;但它们的应用场景和使用方式有所不同。本文将通过对比的方式&#xff0c;帮助开发者更好地理解两者的区别&#xff0c;并通过…

Js 更加优雅地实现Form表单重置

文章目录 前言代码实现代码优化 前言 最近在做一个后台项目 不免大量使用表单 表单查询 编辑 还原 导入导出 不免要经常实现 记录下表单重置的一些方法 代码实现 <div class"Query"><el-form :model"ruleForm" ref"ruleFormref" labe…

【vivado】vivado联合modelsim仿真

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

介绍 TensorFlow 的基本概念和使用场景(AI)

TensorFlow是由Google开发的一个开源机器学习框架&#xff0c;它可以用于构建和训练各种机器学习模型。TensorFlow的基本概念和使用场景如下&#xff1a; 1. 张量&#xff08;Tensor&#xff09;&#xff1a;TensorFlow中的主要数据结构是张量&#xff0c;它是多维数组&#x…

整理—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 的残…

Chromium window.document对象c++实现

一、前端Document 对象 当浏览器载入 HTML 文档, 它就会成为 Document 对象。 Document 对象是 HTML 文档的根节点。 Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。 提示&#xff1a;Document 对象是 Window 对象的一部分&#xff0c;可通过 window.…

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

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

了解Android中为什么需要多线程?

在Android开发中&#xff0c;多线程是一个至关重要的概念。理解并合理应用多线程&#xff0c;可以显著提升应用的性能和用户体验。 一、Android多线程的基本概念 1. 主线程与UI线程 在Android中&#xff0c;主线程也称为UI线程&#xff0c;它负责处理用户输入、事件分发、绘…

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

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

leetcode动态规划(二)-斐波那契数列

题目 509.斐波那契数列 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0…

等保测评:如何进行有效的安全风险管理

等保测评&#xff0c;全称为信息安全等级保护测评&#xff0c;是一种对信息系统和网络安全状况进行评估的过程。其目的是评估系统和网络的安全性&#xff0c;识别潜在的安全风险&#xff0c;并提供安全策略和建议以确保系统和网络的安全性。 等保测评的重要性 等保测评对于组织…

vue播放flv和rtsp 格式视频

vue播放flv和rtsp 格式视频 调用 <znvVideo:vId"0":src"url":type"rtsp"></znvVideo>1.播放flv "flv.js":"1.6.2" 新建znVido.vue <template><div class"box-video" :id"box-video…

构建物联网智能项目的框架与实践

1. 引言 物联网(Internet of Things, IoT)技术已经深入应用到各个领域,从智能家居、智慧城市到工业4.0,其应用的广度与深度不断扩展。物联网智能项目集成了传感器、网络、计算和自动化系统,通过智能化的设备和数据分析实现各种任务的自动执行与优化。随着大数据、人工智能…

机器学习—特性缩放

特性缩放的技术能使梯度下降运行得更快&#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…