vue3中新增的组合式API:ref、reactive、toRefs、computed、watch、provide/inject、$ref
在 Vue3 中,组合式 API 是一种新的编程模式,它允许你更灵活地组织和重用代码。组合式 API 主要包括以下几个部分:
- ref:用于创建响应式数据。
- reactive:用于创建一个响应式对象。
- toRefs:将一个响应式对象转换为普通对象。
- computed:用于创建计算属性。
- watch:用于监听数据变化。
- provide/inject:用于跨组件通信。
ref
类似于vue2中的data(){return{}}
在 Vue3 中,ref
用于创建响应式数据。以下是一个简单的 Vue3 代码示例:
<template><div><h1>{{ count }}</h1><button @click="increment">增加</button></div>
</template><script setup>
import { ref } from 'vue';
//定义简单变量const count = ref(0);function increment() {count.value++;}
// 定义复杂变量
const arr = ref([0,1,2,1,3,4])
const obj = ref({
name:"Tom"
})
</script>
reactive
专门给object赋值的,reactive只能用于复杂变量,不能用于简单变量
在 Vue3 中,reactive
用于创建一个响应式对象。以下是一个简单的 Vue3 代码示例:
<template><div><input v-model="message" placeholder="请输入内容" /><p>{{ message }}</p></div>
</template><script setup>
import { reactive } from 'vue';const state = reactive({message: '',});</script>
在这个示例中,我们使用 reactive
创建了一个名为 state
的响应式对象,并将其返回。然后,在模板中使用 v-model
指令将输入框的值与 state.message
进行双向绑定。这样,当输入框的值发生变化时,state.message
也会相应地更新。
toRefs
在 Vue3 中,toRefs
用于将一个响应式对象转换为一个普通对象,其中每个属性都是一个 ref。以下是一个简单的 Vue3 代码示例:
<template><div><input v-model="message" placeholder="请输入内容" /><p>{{ message }}</p></div>
</template><script setup>
import { reactive, toRefs } from 'vue';const state = reactive({message: '',});const stateRefs = toRefs(state);</script>
在这个示例中,我们首先使用 reactive
创建了一个名为 state
的响应式对象。然后,我们使用 toRefs
将 state
转换为一个普通对象 stateRefs
,其中每个属性都是一个 ref。最后,我们将 stateRefs
解构并返回,以便在模板中使用。
computed
在 Vue3 中,可以使用 computed
函数来创建多个计算属性。以下是一个简单的 Vue3 代码示例:
<template><div><input v-model="message" placeholder="请输入内容" /><p>{{ reversedMessage }}</p><p>{{ uppercaseMessage }}</p></div>
</template><script setup>
import { ref, computed } from 'vue';const message = ref('Hello Vue3!');const reversedMessage = computed(() => {return message.value.split('').reverse().join('');});const uppercaseMessage = computed(() => {return message.value.toUpperCase();});</script>
在这个示例中,我们创建了两个计算属性:reversedMessage
和 uppercaseMessage
。它们分别返回 message
的反转字符串和大写字符串。我们将这两个计算属性解构并返回,以便在模板中使用。
watch
在 Vue3 中,watch
用于监听数据的变化。以下是一个简单的 Vue3 代码示例,包括简单监听、深度监听和监听某一个 object 中的变量,以及同时监听多个简单变量和多个复杂变量:
<template><div><input v-model="message" placeholder="请输入内容" /><p>{{ reversedMessage }}</p><p>{{ uppercaseMessage }}</p><p>{{ person.name }}</p></div>
</template><script setup>
import { ref, watch } from 'vue';const message = ref('Hello Vue3!');const person = ref({ name: 'John', age: 30 });// 简单监听watch(message, (newValue, oldValue) => {console.log('message changed:', newValue, oldValue);});// 深度监听watch(() => person.value, (newValue, oldValue) => {console.log('person changed:', newValue, oldValue);}, { deep: true });// 监听某一个 object 中的变量const personName = computed(() => person.value.name);watch(personName, (newValue, oldValue) => {console.log('person.name changed:', newValue, oldValue);});// 同时监听多个简单变量和多个复杂变量const numbers = ref([1, 2, 3]);const complexObjects = ref([{ a: 1 }, { b: 2 }]);watch([message, numbers, complexObjects], () => {console.log('message, numbers or complexObjects changed');});</script>
在这个示例中,我们创建了一个简单的 message
变量,并使用 watch
函数进行监听。我们还创建了一个 person
对象,并使用 watch
函数进行深度监听。接下来,我们创建了一个计算属性 personName
,并使用 watch
函数监听它的变化。最后,我们创建了两个数组 numbers
和 complexObjects
,并使用 watch
函数同时监听它们的变化。
父子组件的传值
vue3中 使用defineProps 和 defineEmits 进行父子组件的传值:
父传子
子组件:
<template><div>这是子组件:{{fatherName}}</div>
</template><script setup>
const props= defineProps({
fatherName:String
})</script>
父组件:
<template><div>这是父组件:和vue一样的传递方式<child :fatherName='fatherName'></child></div>
</template><script setup>
import child from "子组件地址"
import {ref} from "vue"
const fatherName=ref("父组件变量")</script>
子传父
子组件:
<template><div>这是子组件:{{fatherName}}</div>
</template><script setup>
const props= defineEmits(['setChildname'])
const sendtoFather=()=>{
emit('setChildname',"向父组件传值")
}
</script>
父组件:
<template><div>这是父组件:<child @setChildname='getChildname'></child></div>
</template><script setup>
import child from "子组件地址"
count getChildname=(data)=>{
data就是来自子组件传递的参数
}</script>
顶级向底级传参: provide/inject:用于跨组件通信。
vue2中是使用$evenbus
这样的全局变量来传递变量,其中使用的就是$emit
和$on
来传递数据,但是vue3中没有$on
这个方法
传递值: provide
<template></template><script setup>
import {provide} from "vue"
provide('setname',"这是传递的参数")
</script>
接收值:inject
<template><div>这是接收的值:{{getName}}</div>
</template><script setup>
import {inject} from "vue"
const getName=inject('setname')
</script>
注意:provide/inject:用于跨组件通信只是用于顶级向底级传参,就是从上到下的传递
$ref
父组件通过$ref 调用子组件的方法,并传值
vue3中 子组件还可以使用defineExpose来暴露方法和变量来让父组件获取到子组件的数据
子组件:
<template><div>这是子组件:</div>
</template><script setup>
import {ref} from "vue"const name= ref('子组件名字')const childFun = (data)=>{子组件的方法
}
defineExpose({
name,
chiildFun
})
</script>
父组件:
<template><div>这是父组件:<child ref='child'></child>
子组件的name:{{childObj}}</div>
</template><script setup>
import child from "子组件地址"
import {ref} from "vue"const child= ref(null)const dochiildFun=()=>{child.value.chiildFun({id:1,age:30})}
</script>
相关文章:
vue3中新增的组合式API:ref、reactive、toRefs、computed、watch、provide/inject、$ref
在 Vue3 中,组合式 API 是一种新的编程模式,它允许你更灵活地组织和重用代码。组合式 API 主要包括以下几个部分: ref:用于创建响应式数据。reactive:用于创建一个响应式对象。toRefs:将一个响应式对象转换…...
Flask 密码重设系统
Flask 密码重设系统【源码来自编程浪子Flask点餐小程序】 web/templates/user/reset_pwd.html {% extends "common/layout_main.html" %} {% block content %} {% include "common/tab_user.html" %} <div class"row m-t user_reset_pwd_wrap&q…...

HarmonyOS4.0开发应用(四)【ArkUI状态管理】
ArkUI状态管理 分为以下四个: StateProp和LinkProvide和ConsumeObserved和ObjectLink State 相当于vue中data()内定义的属性变量,相当于react中useState()的使用,即绑定在视图上的响应式变量,可动态更新~ Tip: 标记的变量必须初始化,不可为空…...
JS常见正则表达式写法(附案例)
正则表达式方法示例: 1. test方法解析,test判断正则是否在字符串中出现过,如果出现返回true,如果没出现返回false。 let str hello world; let ret1 /e/.test(str); // true let ret2 /q/.test(str); // false 如&…...

go语言,ent库与gorm库,插入一条null值的time数据
情景介绍 使用go语言,我需要保存xxxTime的字段至数据库中,这个字段可能为空,也可能是一段时间。我采取的是统一先赋值为空,若有需要,则再进行插入(需要根据另一个字段判断是否插入) 在我的数据…...

Java EasyExcel 导入代码
Java EasyExcel 导入代码 导入方法 /*** 仓库库位导入** param req* param res* param files* throws Exception*/RequestMapping(value {"/import/line_store_locs"}, method {RequestMethod.POST})ResponseBodypublic void importStoreLoc(HttpServletRequest …...
2024,5G-A风起,中兴通讯破浪
对于通信圈而言,2024年最关键的里程碑,当属3GPP R18版本即将冻结。作为5G国际标准化组织,3GPP的意义是推动成员公司、工作组和技术规范的研究,让5G发展更有章法。 放眼整个5G技术的演进,其实大致分为两个阶段。第一阶段…...

SuperMap Hi-Fi 3D SDK for Unity矢量面贴地贴模型
作者:kele 一、背景 SuperMap Hi-Fi 3D SDK(2023 11i) for Unity推出新功能:支持矢量面同时贴地形图层和模型图层,并且能实现数据点击查询属性、更改初始填充颜色、初始边框线颜色、选中填充颜色、选中边框线颜色、控…...
【DB2】Maxlocks和防止锁升级
数据库在对行操作的时候,为了避免多个作业互相覆盖影响数据准确性,在进行操作(尤其是写操作)的时候会上锁,同一时间只有一个作业可以修改数值 对行上锁,为了记录锁的信息,所以会占用一定的内存…...

网工内推 | 网络服务工程师,HCIE认证优先,带薪年假,年终奖
01 高凌信息 招聘岗位:服务工程师(珠海) 职责描述: 1、负责华为数通(交换机、路由器)、IT(服务器、存储)等任一或多个产品领域的项目实施交付; 2、独立完成华为数通&…...

TrustZone之可信固件
Trusted Firmware是Armv8-A设备的安全世界软件的开源参考实现。Trusted Firmware为SoC开发人员和OEM提供了一个符合相关Arm规格(包括TBBR和SMCC)的参考Trusted代码库。 以下图表显示了Trusted Firmware的结构: SMC调度程序处理传入的SMC。SMC…...

Visual Studio 2013 中创建一个基于 Qt 的动态链接库:并在MFC DLL程序中使用
在本地已经安装好 Qt 的情况下,按照以下步骤在 Visual Studio 2013 中创建一个基于 Qt 的动态链接库: 一、新建 Qt 项目: 在 Visual Studio 中,选择 “文件” -> “新建” -> “项目…”。在 “新建项目” 对话框中&#…...

云计算:OpenStack 配置云主机实例的资源实现内网互通
目录 一、实验 1. 环境 2.配置项目及用户 3.配置规格实例与镜像 4.配置VPC 5. 配置安全组 6. 创建云主机 cs_01 (cirros系统) 7.创建云主机 cs_02 (cirros系统) 一、实验 1. 环境 (1)宿主机 表1…...

Android原生实现单选
六年前写的一个控件,一直没有时间总结,趁年底不怎么忙,整理一下之前写过的组件。供大家一起参考学习。废话不多说,先上图。 一、效果图 实现思路使用的是radioGroup加radiobutton组合方式。原理就是通过修改RadioButton 的backgr…...
为什么需要对数值类型的特征做归一化?
对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。最常用的方法有以下两种: (1)线性函数归一化(Min-Max Scaling) 它对原始数据进行线性变换,使结果映射到【0,1】的范围&…...

ARM 点灯
.text .global _start _start: led1设置GPIOE时钟使能 RCC_MP_AHB4ENSETR[4]->1 0X50000A28LDR R0,0X50000A28 指定寄存器地址LDR R1,[R0] 将寄存器数值取出来放在R1中ORR R1,R1,#(0x1<<4) 将第4位设置为1STR R1,[R0] 将修改后的值写回去设置PE10为输出 GPIOE…...

CamSim相机模拟器:极大加速图像处理开发与验证过程
随着图像处理技术的不断发展,相机模拟在图像处理开发和验证中扮演着越来越重要的角色。相机模拟能够模拟真实相机的成像过程,提供高质量的图像输入,使开发人员能够更好地评估和调整图像处理算法。本文将探讨如何通过相机模拟来加速图像处理的…...

Google Ad帐号被封?代理IP和电子邮件可能是原因
海外广告投放工作中,账号是非常重要的环节。与在Facebook上运行广告相比,运行Google Ads在代理选择方面通常没有那么严格,因为 Google 对 IP 使用并不那么严格。但是,这并不意味着您可以不加考虑地使用任何代理IP。在本文中&#…...

EfficientNet
时间:2019 EfficicentNet网络简介 EfficientNet:Rethinking Model Scaling for Convolutional Neural Networkshttps://arxiv.org/abs/1905.11946,这篇论文是Google在2019年发表的文章。 EfficientNet这篇论文,作者同时关于输入分辨率,网络…...

百度每天20%新增代码由AI生成,Comate SaaS服务8000家客户 采纳率超40%
12月28日,由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023在北京召开。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰现场公布了飞桨文心五载十届最新生态成果,文心一言最新用户规模破1亿,截…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...