Vue3 Composition API 深度解析:告别Options API的局限性

目录

一、为什么需要Composition API?

二、核心概念:setup() 函数

三、响应式核心:ref() 和 reactive()

1. ref - 处理基本类型/对象

 2. reactive - 处理对象

四、生命周期钩子新写法

五、强大的逻辑复用:组合式函数

六、响应式计算:computed & watch

1. 计算属性

 2. 侦听器

七、最佳实践指南

八、对比Options API 

结语


一、为什么需要Composition API?

在Vue2中,我们使用 Options API(data、methods、computed等选项)组织代码。当组件功能复杂时,相同逻辑的代码被分散到不同选项中,导致:

  • 可读性下降

  • 逻辑复用困难(依赖mixins)

  • Typescript支持有限

Vue3的 Composition API 通过逻辑功能组合解决了这些问题,让代码更灵活、更可维护!

 

二、核心概念:setup() 函数

Composition API的入口是 setup() 函数,它在组件创建前执行,替代了Vue2的data()created()等选项

import { ref } from 'vue';export default {setup() {// 定义响应式数据const count = ref(0);// 定义方法const increment = () => {count.value++;};// 暴露给模板return { count, increment };}
}

 

关键点

  1. setup() 在 beforeCreate 前执行,没有 this

  2. 返回对象中的属性会暴露给模板使用

  3. 所有Composition API函数都需要在此引入

 

三、响应式核心:ref() 和 reactive()

1. ref - 处理基本类型/对象

const num = ref(0);       // { value: 0 }
const user = ref({ name: 'Leo' });console.log(num.value);   // 访问值
num.value = 5;            // 修改值

 2. reactive - 处理对象

const state = reactive({count: 0,user: { name: 'Alice' }
});state.count = 10;         // 直接修改属性
特性refreactive
数据类型任意对象
模板访问自动解包直接访问属性
重新赋值.value 修改不能直接替换对象

 

四、生命周期钩子新写法

setup()中使用生命周期前缀加on

import { onMounted, onUpdated } from 'vue';setup() {onMounted(() => {console.log('组件挂载完成!');});onUpdated(() => {console.log('组件更新了!');});
}

 

Vue2选项Composition API等价
beforeCreatesetup() 自身
createdsetup() 自身
mountedonMounted
updatedonUpdated

 

五、强大的逻辑复用:组合式函数

将相同逻辑抽离为可复用函数(替代mixins):

// useCounter.js
import { ref } from 'vue';export default function useCounter() {const count = ref(0);const increment = () => count.value++;const decrement = () => count.value--;return { count, increment, decrement };
}

 在组件中使用:

import useCounter from './useCounter';setup() {const { count, increment } = useCounter();return { count, increment };
}

优势

  • 显式暴露使用的属性和方法

  • 多个组合函数互不冲突

  • 完美支持TypeScript类型推断

 

六、响应式计算:computed & watch

1. 计算属性

const doubleCount = computed(() => count.value * 2);

 2. 侦听器

// 侦听单个ref
watch(count, (newVal, oldVal) => {console.log(`计数变化:${oldVal} → ${newVal}`);
});// 侦听多个源
watch([count, name], ([newCount, newName]) => {// 处理变化
});

七、最佳实践指南

  1. 按功能组织代码:将同一功能的refcomputedwatch放在一起

  2. 复杂组件使用<script setup>语法糖(SFC专属):

    <script setup>
    import { ref } from 'vue';
    const count = ref(0); // 自动暴露到模板
    </script>
  3. 组合函数命名以use开头(如useMouseTracker

  4. 需要DOM时使用ref绑定元素

    <template><div ref="root">元素</div>
    </template><script>
    import { ref, onMounted } from 'vue';
    export default {setup() {const root = ref(null);onMounted(() => {console.log(root.value); // 获取DOM元素});return { root };}
    }
    </script>

八、对比Options API 

// Options API (Vue2风格)
export default {data() {return { count: 0 }},methods: {increment() { this.count++ }},mounted() {console.log('mounted');}
}// Composition API (Vue3)
export default {setup() {const count = ref(0);const increment = () => { count.value++ };onMounted(() => console.log('mounted'));return { count, increment };}
}

 

结语

Composition API 赋予了Vue开发者更自由的代码组织能力,尤其适合:

  • 大型项目开发

  • 需要高复用性的场景

  • TypeScript深度集成

虽然学习曲线稍陡峭,但它带来的可维护性提升绝对值得投入!现在就开始重构你的Vue组件吧!

 

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

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

相关文章

IoT/HCIP实验-5/基于NB-IoT的智慧农业实验(平台侧开发+端侧编码+基础调试分析)

文章目录 概述扩展板 E53_IA1智慧农业平台测开发功能定义/模型开发编解码插件开发-消息编解码插件开发-关联编解码插件开发-部署注册实际设备 智慧农业端侧编码工程配置数据结构定义数据收集任务数据上报任务设备接入过程正确设置接入参数命令响应任务 程序调试其他 概述 本实…

多网络环境vmware虚拟机配置

环境&#xff1a;一台台式机、一台笔记本、笔记本中安装虚拟机。台式机及笔记本都使用wifi连接。 实现效果&#xff1a;虚拟机采用固定ip方式&#xff0c;台式机可以直接连接虚拟机。 1、VMware环境配置 台式机ip&#xff1a;192.168.31.43 笔记本ip&#xff1a;192.168.31.…

ZArchiver×亚矩云手机:云端文件管理的“超维解压”革命

在数字化办公与移动应用生态中&#xff0c;文件压缩与解压是高频刚需场景&#xff0c;但传统本地工具受限于设备性能、存储空间及跨平台协作痛点。ZArchiver&#xff08;轻量级压缩工具&#xff09;与亚矩云手机的结合&#xff0c;通过“云端算力虚拟化环境”的创新模式&#x…

微帧WZVQA:极致还原人眼感知,精准评估视频画质

随着移动互联网的不断发展以及智能手机的普及&#xff0c;短视频已逐步取代图片和文字&#xff0c;跻身主流媒体形式的前列。短视频平台的兴起&#xff0c;让数十亿用户可以制作&#xff0c;分享并接收彼此的信息&#xff0c;为人们开辟了一条全新的知识获取途径。然而&#xf…

信创 CDC 实战|国产数据库的数据高速通道:OceanBase 实时入仓 StarRocks

国产数据库加速进入核心系统&#xff0c;传统同步工具却频频“掉链子”。本系列文章聚焦 OceanBase、GaussDB、TDSQL、达梦等主流信创数据库&#xff0c;逐一拆解其日志机制与同步难点&#xff0c;结合 TapData 的实践经验&#xff0c;系统讲解从 CDC 捕获到实时入仓&#xff0…

Unity 通过AVProMovieCapture插件实现摄像机录屏

1.AVProMovieCapture插件下载 没什么好说的&#xff0c;搞到安装包之后&#xff0c;直接往项目中拉就行。 2.操作面板配置 &#xff08;1&#xff09;在Hierarchy创建一个空物体&#xff0c;上面添加Capture From Camera和Camera Selector两个插件 &#xff08;2&#xff09…

深度学习:PyTorch卷积神经网络分享(1)

本文目录&#xff1a; 一、CNN概述二、CNN日常应用三、CNN的卷积层&#xff08;一 &#xff09;基本介绍&#xff08;二&#xff09;卷积层计算1.对输入数据的要求2.卷积核核心参数3.计算过程4.特征图尺寸计算5.1、多通道卷积计算5.2、多卷积核计算6.PyTorch卷积层API 前言&…

Cesium添加3dtiles并平移到指定经纬度

访问tileset.json,查看root.transform,12,13,14分别代表模型参考原点的地心坐标Cartesian3(x,y,z) let tileset await Cesium.Cesium3DTileset.fromUrl()构造origin_cartesian3new Cesium.Cartesian3(x,y,z) 设置待平移到的位置经纬高为longitude,latitude,height,例如(116,…

STM32G070x 单片机项目代码解析:基于 HAL 库的嵌入式系统开发

项目总体架构 该项目采用标准的 STM32 工程结构&#xff0c;主要包含以下几个部分&#xff1a; 头文件包含&#xff1a;系统头文件和用户自定义头文件外设句柄定义&#xff1a;SPI、TIM、UART 等外设的句柄声明用户自定义变量&#xff1a;LED 控制、按键状态等标志位初始化函数…

winform mvvm

if (!mvvmContext1.IsDesignMode) InitializeBindings(); 这段代码的意思是&#xff1a;如果当前应用程序不是处于设计模式&#xff08;即程序正在运行&#xff09;&#xff0c;就调用InitializeBindings方法来初始化视图与视图模型之间的绑定。 void Initiali…

防火墙快速管理软件,66K超小巧

软件介绍 今天为大家推荐一款轻量级的Windows防火墙管理工具&#xff0c;这款工具能帮助用户快速开启或关闭系统防火墙功能&#xff0c;操作比系统原生设置更加便捷高效。 软件优势 相比通过系统设置层层点击的操作方式&#xff0c;这款仅66KB大小的微型工具只需单击按钮…

python中的高级变量III

python中的高级变量III 删除列表元素&#xff08;list&#xff09;扩展知识点 name_list ["Mike","John","Alice"] del name_list[1] # 通过del name_list[1]删除“John” print(name_list) # 输出 [Mike, Alice]注意&#xff1a;del …

深入理解Redis

深入理解Redis&#xff1a;高性能内存数据库的核心原理与应用实践 1. 引言 在现代互联网应用中&#xff0c;高性能、低延迟的数据访问是至关重要的。传统的关系型数据库&#xff08;如MySQL&#xff09;虽然功能强大&#xff0c;但在高并发场景下往往成为性能瓶颈。Redis&…

界面控件DevExpress Blazor中文教程:AI聊天 - 如何实现函数调用?

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验&#xff0c;这个UI自建库提供了一套全面的原生Blazor UI组件&#xff08;包括Pivot Grid、调度程序、图表、数据编辑器和报表等&#xff09;。 现代AI驱动的应用程序需要与外部系…

github 上的php项目

github 上的php项目 项目的网址 &#xff08;Loong1996/LikeGirlSite: 情侣网站、情侣网页、恋爱记录网站&#xff09; # 修改 # admin/Config_DB.php//localhost 为数据库地址 一般使用默认的即可 或&#xff08;127.0.0.1&#xff09; $db_address "mysql_php";/…

区间求最值问题高效解决方法

对于区间求最值场景&#xff0c;如果区间不定长度的&#xff0c;可以使用稀疏表进行求解&#xff0c;如果区间是固定长度的&#xff0c;则可以使用分块的思想&#xff08;与稀疏表原理类似&#xff09;&#xff0c;都是通过压缩状态个数&#xff0c; 1 关于稀疏表的原理详见&a…

Linux程序设计:什么时候选择开发内核模块?

最近看一个CPU使用率高的问题,从perf里看,是下面的一个占用的比较多是下面一个 Overhead Source:Line Symbol Shared Object - 8.48% [vdso][1129] 0x1129 B [.] 0x0000000000001129

OpenCV CUDA模块设备层-----欧几里得距离函数hypot()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于计算两个无符号字符向量&#xff08;uchar1&#xff09;的欧几里得距离&#xff08;即直角三角形的斜边长度&#xff09;&#xff0c;…

惠普HP LaserJet Pro P1106 打印机信息

基本信息 产品类型&#xff1a;黑白激光打印机。上市时间&#xff1a;2011 年。最大打印幅面&#xff1a;A4。网络打印&#xff1a;不支持网络打印。双面打印&#xff1a;手动双面打印。 性能参数 打印速度&#xff1a;黑白打印速度&#xff08;ISO&#xff0c;A4&#xff09;正…

通义灵码智能体模式在企业级开发中的应用:以云效DevOps自动化流程为例

一、智能体模式的核心能力 通义灵码的智能体模式区别于传统代码补全工具&#xff0c;具备&#xff1a; 语义级理解&#xff1a;解析业务需求、代码上下文及错误日志。自主任务闭环&#xff1a;从问题诊断→ 代码生成→ 测试覆盖→ 文档生成全流程自动化。环境感知&#xff1a…