vue3 5个常用的API

Vue3之于Vue2最大的变化,当属composition API了,而除了引入composition API外,一些我们在Vue2上经常使用的东西到了Vue3时也发生了不小的变化,本文将介绍一些有Vue2到Vue3中几个比较重要且常用的知识点。

Options API与Composition API

Options API是把代码分类写在几个Option中:

export default {components: {},data() {},computed: {},watch: {},mounted() {},
}

Composition API没有固定的代码分类,可以自由按自己的逻辑组织代码结构。

当组件比较简单只有一个逻辑的时候,option模式可以很快浏览组件代码,可读性非常高,新手友好。但如果组件代码庞大复杂,option的缺陷就很明显,需要在各Option中横跳才能分清功能模块。这时Composition 模式就更有优势,处理同一个模块的自行组织或者提取hook,而这个需要开发者的自觉,优点即缺点,代码组织不规范就会造成混乱。

image.png

文中代码示例使用setup语法糖 + ts

v-model

支持多个v-model

Vue3中,可以通过参数来达到一个组件支持多个v-model的能力。

// 父组件
<template><child v-model="name" v-model:email="email" /><p>姓名:{{ name }}</p><p>邮箱:{{ email }}</p>
</template><script lang="ts" setup>
import child from './child.vue'
import { ref } from 'vue'const name = ref<string>('张三')
const email = ref<string>('666@qq.com')
</script>
// 子组件
<template><button @click="updateName">更新name</button><button @click="updateEmail">更新email</button>
</template><script lang="ts" setup>
import {defineEmits} form 'vue'
// 定义emit
const emits = defineEmits<{(e: 'update:modelValue', value: string): void(e: 'update:email', value: string): void
}>()const updateName = () => {emits('update:modelValue', '李四')
}const updateEmail = () => {emits('update:email', '123456@qq.com')
}
</script>

如果v-model没有使用参数,则其默认值为modelValue,如上面的第一个v-model,注意此时不再是像Vue2那样使用$emit('input')了,而是统一使用update:xxx的方式。

废弃.sync

在Vue2中,由于一个组件只支持一个v-model,当我们还有另外的值也想要实现双向绑定更新时,往往用.sync修饰符来实现,而在Vue3中该修饰符已被废弃,因为v-model可以支持多个,所以.sync也就没有存在的必要了。

watch

不同数据类型的监听

基础数据类型的监听:

const name = ref<string>('张三')
watch(name, (newValue, oldValue) => {console.log('watch===', newValue, oldValue)
})

复杂数据类型的监听:

interface UserInfo {name: stringage: number
}const userInfo = reactive<UserInfo>({name: '张三',age: 10
})
// 监听整个对象
watch(userInfo, (newValue, oldValue) => {console.log('watch userInfo', newValue, oldValue)
})// 监听某个属性
watch(() => userInfo.name,  (newValue, oldValue) => {console.log('watch name', newValue, oldValue)
})

支持监听多个源

Vue3里,watch多了一个特性,可以传入一个数组同时侦听多个数据,这比起Vue2确实优雅多了,以往在Vue2中为了实现同时监听多个数据,往往需要借助computed,现在在Vue3里我们可以少一些不必要的代码了。

const name = ref<string>('张三')
const userInfo = reactive({age: 18
})// 同时监听name和userInfo的age属性
watch([name, () => userInfo.age], ([newName, newAge], [oldName, oldAge]) => {// 
})

watchEffect

watchEffect与watch的区别

相比Vue2Vue3多watchEffect这个API,watchEffect传入一个函数参数,该函数会立即执行,同时会响应式的最终函数内的依赖变量,并在依赖发生改变时重新运行改函数。

const name = ref<string>('张三')
const age = ref<number>(18)watchEffect(() => {console.log(`${name.value}:${age.value}`) // 张三:18
})setTimeout(() => {name.value = '李四' // 李四:18
}, 3000)setTimeout(() => {age.value = 20 // 李四:20
}, 5000)

和watch的区别:

  • 运行时机不同,watchEffect会立即执行,相当于设置了immediate: truewatch
  • watchEffect无法获取改变前后的值。
  • watch显示的指定依赖源不同,watchEffect会自动收集依赖源。

$attrs

Vue3中,$attrs包含父组件中除props和自定义事件外的所有属性集合。

不同于Vue2$attrs包含了父组件的事件,因此$listenners则被移除了。

// 父组件
<template><child id="root" class="test" name="张三" @confirm="getData" />
</template><script lang="ts" setup>
const getData = () => {console.log('log')
}
</script>// 子组件
<template><div><span>hello:{{ props.name }}</span></div>
</template><script lang="ts">
export default {inheritAttrs: false
}
</script><script lang="ts" setup>
import { defineProps, useAttrs} from 'vue'
const props = defineProps(['name'])const attrs = useAttrs()
console.log('attrs', attrs)
</script>
image.png

使用v-bind即可实现组件属性及事件透传:

// 父组件
<template><child closeable @close="onClose" />
</template><script lang="ts" setup>
const onClose = () => {console.log('close')
}
</script>// 子组件
<template><div><el-tag v-bind="attrs">标签</el-tag></div>
</template>
<script lang="ts" setup>
import {useAttrs} from 'vue'
const attrs = useAttrs()
</script>

使用ref访问子组件

Vue2中,使用ref即可访问子组件里的任意数据及方法,但在Vue3中则必须使用defineExpose暴露子组件内的方法或属性才能被父组件所调用。

// 父组件
<template><child ref="childRef" />
</template><script lang="ts" setup>
import { ref, onMounted } from 'vue'const childRef = ref()onMounted(() => {childRef.value.getData()
})
</script>// 子组件
<script lang="ts" setup>
import { defineExpose } from 'vue'const getData = () => {console.log('getData')
}
const name = ref('张三')defineExpose({getData,name
})
</script>

完毕~

学习参考:
vue3文档:https://cn.vuejs.org/guide/introduction.html
https://juejin.cn/post/7139721466722910245#heading-9

最后编辑于:2024-09-09 20:04:29


喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

世界主要国家跨境数据流动的政策法规及其启示

文章目录 前言一、主要国家加强跨境数据流动的监管措施二、全球跨境数据流动的关键问题三、中国跨境数据流动治理的不足与对策前言 随着数据成为全球经济发展的战略资源,各国政府正积极构建安全有效的治理体系,以扩大数据的社会和经济效益,探讨世界主要国家跨境数据流动的政…

3D云渲染农场为何怎么贵?主要消耗成本介绍

随着对高质量3D动画的需求持续增长&#xff0c;云渲染农场对于旨在以高效速度生产高质量视觉效果的工作室来说变得至关重要。然而&#xff0c;用户经常想知道为什么渲染农场的价格如此之高&#xff0c;理解背后的原因可以帮助艺术家做出更好的选择。 什么是云渲染农场&#xff…

基于Spring Boot的能源管理系统+建筑能耗+建筑能耗监测系统+节能监测系统+能耗监测+建筑能耗监测

建筑能耗数据采集器是一种采用嵌入式微计算机系统的建筑能耗数据采集专用装置&#xff0c;具有数据采集、数据处理、数据 存储、数据传输以及现场设备运行状态监控和故障诊断等功能。 下行具有2路RS485接口、2路RS485/RS232复用接口、1路MBUS接口&#xff0c;支持DL/T645、Modb…

深度学习经典模型之T5

T5(Text-to-Text Transfer Transformer) 是继BERT之后Google的又外力作&#xff0c;它是一个文本到文本迁移的基于Transformer的NLP模型&#xff0c;通过将 所有任务统一视为一个输入文本并输出到文本(Text-to-Text)中&#xff0c;即将任务嵌入在输入文本中&#xff0c;用文本的…

机器学习(西瓜书)第 4 章 决策树

4.1 决策树基本流程 决策树模型 基本流程 在第⑵种情形下&#xff0c;我们把当前结点标记为叶结点&#xff0c;并将其类别设定为该结点所含样本最多的类别&#xff1b;在第⑶种情形下&#xff0c;同样把当前结点标记为叶结点&#xff0c;但将其类别设定为其父结点所含样本最多…

Maven私服Nexus安装及使用

前言 周末在家闲着无聊&#xff0c;不知道做点啥&#xff0c;就想着自己搭建一个Maven私服来玩玩。刚好使用自己之前在电脑上搭建的虚拟机服务器来操作体验了一把。搭建好私服后&#xff0c;以后自己写的一些小模块啊&#xff0c;工具包啥的就可以发布到自己的私服上了&#xf…

2024网络安全人才实战能力白皮书安全测试评估篇

9月10日&#xff0c;国内首个聚焦“安全测试评估”的白皮书——《网络安全人才实战能力白皮书-安全测试评估篇》&#xff08;以下简称“白皮书”&#xff09;在国家网络安全宣传周正式发布。 作为《网络安全人才实战能力白皮书》的第三篇章&#xff0c;本次白皮书聚焦“安全测…

上海市高等学校信息技术水平考试 C程序设计(2020D场)全解

C语言程序一定是从mian函数开始的&#xff1b;在主函数中&#xff0c;一次又一次调用了其他函数&#xff0c;但不代表程序是在代码行的最后一个函数结束&#xff1b;而是在主函数中&#xff0c;遇到了return 0 才会程序结束。 标识符&#xff1a;在编程语言中&#xff0c;标识符…

Ubuntu下安装最新版本Apache2文件服务器

文章目录 1.最新版本Apache2安装2. Apache2配置2.1 端口配置2.2 创建软连接,生成文件服务2.3 隐藏Apache2服务版本号2.4 添加用户&#xff0c;设置Apache2文件服务密码2.5 重启Apache2服务 3. 执行后效果 1.最新版本Apache2安装 注意&#xff1a;安装最新版本必须升级Ubuntu为2…

【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件

目录 1、Swiper轮播组件 1.1 Swiper基本用法 1.2 Swiper的常见属性 1.3 Swiper的样式自定义 1.3.1 基本语法 1.3.2 案例小米有品 2、样式&结构重用 2.1 Extend:扩展组件(样式、事件) 2.2 Styles:抽取通用属性、事件 2.3 Builder:自定义构建函数(结构、样式、事…

CentOS 7停更官方yum源无法使用,更换阿里源

CentOS 7官方源已经停止维护&#xff0c;导致无法使用yum更新软件。通过尝试使用阿里云、清华大学等第三方源解决&#xff0c;现以阿里云第三方源进行配置&#xff1a; 1、备份原有的yum源配置文件 # cp -a /etc/yum.repos.d /etc/yum.repos.d.bak 2、删除原有的yum源配置文…

基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)

拖动前播放位置&#xff1a; 拖动后播放位置&#xff1a; 在Slider组件中&#xff0c;添加onChange方法进行监听&#xff0c;当视频轨道拖放结束时&#xff0c;触发this.seekTo()函数&#xff0c;其中seekTo函数需要传递一个视频已播放时长作为参数 Slider({ value: this.p…

基于Neo4j知识图谱的构建及可视化

基于Neo4j知识图谱的构建及可视化 前言 手把手教你基于Neo4j构建知识图谱可视化系统。有任何疑问或者需要提供帮助都可以私信我。 一、环境搭建 1.1 安装JDK 下载和安装Neo4j之前&#xff0c;首先必须 安装Java JDK&#xff0c;因为Neo4j是基于Java的图形数据库&#xff0c…

Model for OpenAI gym‘s Lunar Lander not converging

题意&#xff1a;OpenAI Gym 的 Lunar Lander 模型未收敛 问题背景&#xff1a; I am trying to use deep reinforcement learning with keras to train an agent to learn how to play the Lunar Lander OpenAI gym environment. The problem is that my model is not conver…

内网穿透的应用-Deepin系统安装x11vnc实现任意设备无公网IP远程连接Deepin桌面

文章目录 前言1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 前言 本文主要介绍在Deepin系统中安装x11vnc工具&#xff0c;并结合Cpolar内网穿透工具实现任意设备无公网IP也可…

HTML深度探索 :img应用与实践

HTML深度探索 &#xff1a;img应用与实践 1、定义和用法2、图像格式3、常用属性4、预加载和懒加载4.1 预加载4.2 懒加载 1、定义和用法 HTML 元素 <img>将一张图像嵌入文档。 从技术上讲&#xff0c;实际上并没有将图像插入到网页中&#xff0c;而是将图像链接到了网页。…

Maven从入门到精通(三)

一、Settings 配置 settings.xml 用来配置 maven 项目中的各种参数文件&#xff0c;包括本地仓库、远程仓库、私服、认证等信息。 全局 settings、用户 setting、pom 的区别&#xff1a; 全局 settings.xml 是 maven 的全局配置文件&#xff0c;一般位于 ${maven.home}/conf…

API数据接口:开启智能应用的钥匙

在当今数字化时代&#xff0c;数据已成为企业的核心资产。API&#xff08;应用程序编程接口&#xff09;数据接口作为连接不同软件和服务的桥梁&#xff0c;正变得越来越重要。本文将为您详细介绍API数据接口的概念、优势、使用场景以及如何高效利用API接口&#xff0c;以期帮助…

初学51单片机之IO口上下拉电阻相关

本案本来是描述一下I2C总线的&#xff0c;在此之前推荐一下B站一个UP关于时序图的讲解 I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 不过在描述I2C前先简单的探讨下51单片机IO口下拉电阻的基本情况&#xff0c;事实上这个问题困扰笔者很长时间了&#xff0c;这次也是一…

Llama Factory :百种以上语言模型的统一高效微调框架

人工智能咨询培训老师叶梓 转载标明出处 大模型适应到特定下游任务时&#xff0c;传统的全参数微调方法成本高昂&#xff0c;因此&#xff0c;研究者们一直在探索更高效的微调技术。由北京航空航天大学和北京大学的研究团队提出了一个名为Llama Factory的统一框架&#xff0c;…