当前位置: 首页 > article >正文

Vue3组合式API进阶:深入理解和高效使用Composition API

Vue3组合式API进阶深入理解和高效使用Composition API前言大家好我是前端老炮儿今天咱们来聊聊Vue3组合式API的进阶用法。你以为ref和reactive就够了那你可太天真了Vue3的Composition API远比你想象的更强大。为什么需要Composition APIOptions API的问题Options API → 逻辑分散 → 难以复用 Options API → 关注点分离 → 阅读困难 Options API → 类型推断差 → 开发体验不佳Composition API的优势逻辑复用变得简单代码组织更加灵活更好的TypeScript支持更细粒度的响应式控制基础API回顾ref和reactivescript setup import { ref, reactive } from vue // ref用于基本类型 const count ref(0) const name ref() // reactive用于对象 const state reactive({ user: { name: 张三, age: 25 }, items: [] }) // 修改ref值 count.value // 修改reactive值 state.user.name 李四 /scriptcomputedscript setup import { ref, computed } from vue const firstName ref(张) const lastName ref(三) // 计算属性 const fullName computed(() { return ${firstName.value}${lastName.value} }) // 可写的计算属性 const fullName2 computed({ get: () ${firstName.value}${lastName.value}, set: (newValue) { const [first, last] newValue.split() firstName.value first lastName.value last } }) /scriptwatch和watchEffectscript setup import { ref, watch, watchEffect } from vue const count ref(0) const name ref() // watch监听特定数据源 watch(count, (newVal, oldVal) { console.log(count changed from ${oldVal} to ${newVal}) }) // 监听多个数据源 watch([count, name], ([newCount, newName], [oldCount, oldName]) { console.log(count: ${oldCount} - ${newCount}) console.log(name: ${oldName} - ${newName}) }) // 深度监听 const state reactive({ user: { name: 张三 } }) watch(state, (newState) { console.log(state changed:, newState) }, { deep: true }) // watchEffect自动追踪依赖 watchEffect(() { console.log(count is: ${count.value}) }) /script进阶APIref进阶script setup import { ref, shallowRef, triggerRef } from vue // shallowRef只追踪顶层值变化 const shallow shallowRef({ name: 张三 }) // 修改嵌套属性不会触发更新 shallow.value.name 李四 // 不会触发更新 // 需要手动触发 triggerRef(shallow) // 触发更新 // ref的特性 const count ref(0) // 获取原始值 console.log(count.value) // 解包 const state reactive({ count }) console.log(state.count) // 自动解包输出0 /scriptreactive进阶script setup import { reactive, shallowReactive, readonly, shallowReadonly } from vue // shallowReactive只响应顶层属性 const shallowState shallowReactive({ user: { name: 张三 } }) // 修改顶层属性会触发更新 shallowState.user { name: 李四 } // 会触发更新 // 修改嵌套属性不会触发更新 shallowState.user.name 王五 // 不会触发更新 // readonly创建只读代理 const state reactive({ count: 0 }) const readOnlyState readonly(state) // 尝试修改会警告 readOnlyState.count // 警告不能修改只读属性 // shallowReadonly只保护顶层 const shallowRead shallowReadonly({ user: { name: 张三 } }) // 顶层不能修改 shallowRead.user {} // 警告 // 嵌套属性可以修改 shallowRead.user.name 李四 // 不会警告 /scriptcomputed进阶script setup import { ref, computed } from vue const items ref([1, 2, 3, 4, 5]) // 计算属性缓存 const doubled computed(() { console.log(computing...) return items.value.map(item item * 2) }) // 只有依赖变化时才重新计算 console.log(doubled.value) // 输出: computing... [2,4,6,8,10] console.log(doubled.value) // 输出: [2,4,6,8,10] (没有重新计算) // 计算属性作为依赖 const sum computed(() { return doubled.value.reduce((acc, val) acc val, 0) }) console.log(sum.value) // 30 /scriptwatch进阶script setup import { ref, watch, watchEffect } from vue const count ref(0) // 立即执行 watch(count, (newVal) { console.log(count:, newVal) }, { immediate: true }) // 深度监听 const state reactive({ nested: { value: 0 } }) watch(state, (newState) { console.log(nested value:, newState.nested.value) }, { deep: true }) // 停止监听 const stop watch(count, (newVal) { console.log(count changed:, newVal) }) // 停止监听 stop() // watchEffect清理 watchEffect((onCleanup) { const timer setTimeout(() { console.log(done) }, 1000) // 清理函数 onCleanup(() { clearTimeout(timer) }) }) /script组合式函数创建组合式函数script setup import { ref, onMounted, onUnmounted } from vue // useMouse组合式函数 function useMouse() { const x ref(0) const y ref(0) function handleMouseMove(e) { x.value e.clientX y.value e.clientY } onMounted(() { window.addEventListener(mousemove, handleMouseMove) }) onUnmounted(() { window.removeEventListener(mousemove, handleMouseMove) }) return { x, y } } // 使用 const { x, y } useMouse() /script template div Mouse position: {{ x }}, {{ y }} /div /template带参数的组合式函数script setup import { ref, onMounted, onUnmounted } from vue // useDebounce组合式函数 function useDebounce(value, delay 300) { const debouncedValue ref(value) let timer null function updateDebouncedValue(newValue) { if (timer) clearTimeout(timer) timer setTimeout(() { debouncedValue.value newValue }, delay) } // 监听值变化 watch(value, (newVal) { updateDebouncedValue(newVal) }) onUnmounted(() { if (timer) clearTimeout(timer) }) return debouncedValue } // 使用 const searchQuery ref() const debouncedQuery useDebounce(searchQuery, 500) /script组合式函数组合script setup import { ref, computed } from vue // useUser组合式函数 function useUser() { const user ref(null) const loading ref(false) async function fetchUser(userId) { loading.value true const response await fetch(/api/users/${userId}) user.value await response.json() loading.value false } return { user, loading, fetchUser } } // usePosts组合式函数 function usePosts(userId) { const posts ref([]) const loading ref(false) async function fetchPosts() { loading.value true const response await fetch(/api/users/${userId.value}/posts) posts.value await response.json() loading.value false } return { posts, loading, fetchPosts } } // 组合使用 const { user, loading: userLoading, fetchUser } useUser() const { posts, loading: postsLoading, fetchPosts } usePosts(computed(() user.value?.id)) onMounted(async () { await fetchUser(1) await fetchPosts() }) /script响应式工具函数isRef、isReactive、isReadonlyscript setup import { ref, reactive, readonly, isRef, isReactive, isReadonly } from vue const count ref(0) const state reactive({ count: 0 }) const readOnlyState readonly(state) console.log(isRef(count)) // true console.log(isReactive(state)) // true console.log(isReadonly(readOnlyState)) // true console.log(isReactive(readOnlyState)) // false /scripttoRef、toRefsscript setup import { reactive, toRef, toRefs } from vue const state reactive({ name: 张三, age: 25 }) // toRef创建单个ref const nameRef toRef(state, name) // 修改ref会影响原对象 nameRef.value 李四 console.log(state.name) // 李四 // toRefs将对象转为ref对象 const refs toRefs(state) console.log(refs.name.value) // 李四 console.log(refs.age.value) // 25 /scriptmarkRaw、shallowRefscript setup import { reactive, markRaw, shallowRef } from vue // markRaw标记为原始值不被响应式系统追踪 const rawObject markRaw({ name: 张三 }) const state reactive({ data: rawObject }) // 修改rawObject不会触发响应 rawObject.name 李四 // 不会触发更新 // shallowRef配合markRaw使用 const config shallowRef(markRaw({ theme: dark, apiUrl: https://api.example.com })) /script生命周期钩子组合式API中的生命周期script setup import { onMounted, onUpdated, onUnmounted } from vue // 挂载后 onMounted(() { console.log(组件挂载完成) }) // 更新后 onUpdated(() { console.log(组件更新完成) }) // 卸载前 onUnmounted(() { console.log(组件即将卸载) }) // 其他钩子 // onBeforeMount // onBeforeUpdate // onBeforeUnmount // onErrorCaptured // onRenderTracked // onRenderTriggered /script生命周期顺序// 创建阶段 // 1. setup() // 2. onBeforeMount // 3. onMounted // 更新阶段 // 1. onBeforeUpdate // 2. 重新执行setup中的响应式代码 // 3. onUpdated // 卸载阶段 // 1. onBeforeUnmount // 2. onUnmounted依赖注入provide和inject!-- 父组件 -- script setup import { provide, ref } from vue const theme ref(light) // 提供值 provide(theme, theme) // 提供方法 provide(toggleTheme, () { theme.value theme.value light ? dark : light }) /script !-- 子组件 -- script setup import { inject } from vue // 注入值 const theme inject(theme) // 注入方法 const toggleTheme inject(toggleTheme) /script template div :classtheme button clicktoggleThemeToggle Theme/button /div /template带默认值的注入script setup import { inject } from vue // 带默认值 const theme inject(theme, light) // 使用工厂函数 const config inject(config, () ({ apiUrl: https://api.example.com })) /script最佳实践1. 组织组合式函数src/ composables/ useMouse.js useDebounce.js useLocalStorage.js useFetch.js2. 单一职责// 好的做法每个组合式函数只做一件事 function useFetch(url) { const data ref(null) const loading ref(false) const error ref(null) async function execute() { loading.value true try { const response await fetch(url) data.value await response.json() } catch (err) { error.value err.message } finally { loading.value false } } return { data, loading, error, execute } }3. 使用TypeScriptimport { ref } from vue interface User { id: number name: string email: string } function useUser(): { user: RefUser | null loading: Refboolean fetchUser: (id: number) Promisevoid } { const user refUser | null(null) const loading ref(false) async function fetchUser(id: number) { loading.value true const response await fetch(/api/users/${id}) user.value await response.json() loading.value false } return { user, loading, fetchUser } }常见问题与解决方案Q1: ref值修改后没有更新视图原因没有使用.value访问ref使用了shallowRef但没有触发更新解决方案确保使用.value使用triggerRef手动触发Q2: watch监听不到嵌套属性变化原因没有设置deep: true使用了shallowReactive解决方案设置deep: true选项使用reactive代替shallowReactiveQ3: 组合式函数中的响应式数据没有正确传递原因没有返回ref或reactive返回了普通对象解决方案返回响应式对象使用toRefs转换总结Vue3组合式API是前端开发的利器基础APIref、reactive、computed、watch进阶APIshallowRef、shallowReactive、readonly组合式函数封装可复用逻辑响应式工具isRef、toRef、toRefs、markRaw生命周期onMounted、onUpdated、onUnmounted依赖注入provide、inject希望今天的分享能帮助你更好地掌握Vue3组合式API如果你有任何问题或建议欢迎在评论区留言关注我每天分享前端干货让我们一起成长

相关文章:

Vue3组合式API进阶:深入理解和高效使用Composition API

Vue3组合式API进阶:深入理解和高效使用Composition API 前言 大家好,我是前端老炮儿!今天咱们来聊聊Vue3组合式API的进阶用法。 你以为ref和reactive就够了?那你可太天真了!Vue3的Composition API远比你想象的更强大。…...

别再折腾源码编译了!用Docker 5分钟搞定 mediasoup-demo v5 视频会议服务器部署

5分钟极速部署:Docker化mediasoup视频会议系统实战指南 在实时音视频通信领域,快速搭建可靠的测试环境往往是开发者面临的第一道门槛。传统源码编译方式需要处理Node.js版本兼容、依赖下载、端口配置等一系列繁琐问题,而Docker技术为这一过程…...

专业的水情监视图厂家

在城市建设与发展过程中,水情监测至关重要。尤其是在暴雨等极端天气下,城市低洼地带、老旧小区等区域容易出现积水问题,严重影响交通和居民生活安全。因此,选择一家专业的水情监视图厂家,对于城市管理者来说是一项关键…...

Vue3最佳实践:编写高质量代码的指南

Vue3最佳实践:编写高质量代码的指南 前言 各位前端小伙伴,不知道你们有没有遇到过这种情况:项目越来越大,代码越来越难维护! 我曾经加入过一个Vue3项目,代码混乱不堪,维护成本极高。后来我引入了…...

基于C++实现(控制台)图书管理系统

♻️ 资源 大小: 1.70MB ➡️ 资源下载:https://download.csdn.net/download/s1t16/87430290 图书管理系统 题目概述 首先认为大多数同学好像都计划设计游戏,我们想设计不一样的,再因为以前大家都做过一次手机的通讯录&#x…...

3步解决Android Studio英文界面困扰:完整中文插件配置指南

3步解决Android Studio英文界面困扰:完整中文插件配置指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Andr…...

Ubuntu 22.04 下 Nsight System/Compute 2023.3 保姆级安装与权限配置指南(解决libxcb/perf_event报错)

Ubuntu 22.04 下 Nsight System/Compute 2023.3 保姆级安装与权限配置指南 在深度学习与高性能计算领域,NVIDIA的Nsight工具套件是开发者不可或缺的性能分析利器。本文将手把手带你完成Ubuntu 22.04系统上最新版Nsight System 2023.3和Nsight Compute 2023.2的完整…...

SD-PPP终极秘籍:在Photoshop中直接召唤AI助手的实战宝典

SD-PPP终极秘籍:在Photoshop中直接召唤AI助手的实战宝典 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 你是否曾为了给设计作品添加AI特效,不得不在Photoshop和AI工具间来回切换、导出导入…...

手把手教你用Wireshark(或类似工具)理解AMBA AXI总线上的数据流(以Cortex-A53为例)

实战解析:用Wireshark透视Cortex-A53的AXI总线数据流 在嵌入式系统开发中,AXI总线如同SoC的神经系统,承载着处理器核心与各功能模块间的关键通信。对于底层驱动工程师和FPGA开发者而言,能够直观观察总线上的数据流动,就…...

别再只用ROC了!用R语言ggplot2为你的Logistic回归模型画个校准曲线(附完整代码)

超越ROC:用R语言打造兼具诊断力与美学的Logistic回归校准曲线 当我们在医学统计或信用评分领域构建预测模型时,常常陷入一个认知陷阱——过度依赖ROC曲线和AUC值作为模型评估的唯一标准。这种单一视角可能掩盖了预测模型中更本质的问题:当模型…...

Air001实战指南:利用Arduino生态快速构建智能硬件原型

1. Air001芯片与Arduino生态的完美结合 第一次拿到Air001开发板时,我完全被它的小巧震惊了——这个只有指甲盖大小的芯片,居然内置了ARM Cortex-M0内核,还能跑48MHz主频。更让我惊喜的是,它完美兼容Arduino生态,这意味…...

终极CAD数据解放方案:深度解析LibreDWG开源DWG转换工具实战指南

终极CAD数据解放方案:深度解析LibreDWG开源DWG转换工具实战指南 【免费下载链接】libredwg Official mirror of libredwg. With CI hooks and nightly releases. PRs ok 项目地址: https://gitcode.com/gh_mirrors/li/libredwg 在当今数字化设计时代&#xf…...

京沪高铁涨价了,传说中的“牛马专列”要坐不起了?

一直以来,京沪高铁因为其连通北京上海这两大重要城市,成为了最受关注的高铁线路,然而就在最近京沪高铁的涨价引发了市场的热议,让人不禁想问传说中的“牛马专列”要坐不起了? 一、京沪高铁涨价了? 据南方都…...

【2026】记录在windows编译llama.cpp步骤,AMD CPU本地部署千问3.5本地大模型,内存占用低

前言 我的电脑是AMD的32G内存,没有GPU,偏要玩一玩千问3.5本地大语言模型,github上下载的llama安装包,无法使用,只有自己编译试试了。注意我是编译CPU版本的,你有GPU这篇别看了。 以下是我的CPU型号: 1.…...

SEO老鸟私藏技巧:用Google搜索命令“免费”做竞品分析和内容审计

SEO高手实战:用Google搜索命令低成本破解竞品策略 在预算有限的情况下,如何像专业SEO团队一样获取竞品的关键数据?当价值上万元的SEO工具遥不可及时,Google搜索命令的组合拳能帮你打开一扇免费的分析窗口。这不是简单的运算符罗列…...

跨平台资源下载神器:如何突破平台限制轻松获取网络内容?

跨平台资源下载神器:如何突破平台限制轻松获取网络内容? 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …...

Source Han Serif CN:免费开源中文字体跨平台完整解决方案终极指南

Source Han Serif CN:免费开源中文字体跨平台完整解决方案终极指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文字体授权费用高、跨平台兼容性差而烦恼吗&…...

量子机器学习革新气象预测:高效台风轨迹建模

1. 量子机器学习在气象预测中的革新应用台风轨迹预测一直是气象学领域的重大挑战。传统数值天气预报(NWP)模型依赖于超级计算机集群,需要处理海量的大气动力学数据,计算成本高昂且能耗巨大。以台湾地区为例,每年平均遭受3.5次台风袭击&#x…...

2026年计算机专业就业现状,不想35岁被淘汰?网络安全或许是程序员的最佳转型方向!

计算机专业虽进入分化阶段,但网络安全人才缺口达300万,高端领域供不应求。高校扩招与市场需求脱节导致供需失衡,未来"计算机行业"的复合型人才更具竞争力。建议早做规划,构建"T型能力体系",掌握前…...

别再只会拖控件了!FastReport 实战:手把手教你用代码搞定复杂报表(含分组、过滤、合计)

代码驱动报表革命:FastReport高级开发实战指南 在电商后台系统中,销售报表往往需要处理动态分组、条件过滤和跨页合计等复杂需求。传统拖拽式设计工具虽然入门简单,但面对这类业务场景时常常捉襟见肘。本文将带你突破界面限制,通过…...

Linux命令行玩转CAN总线:像查日志一样用grep分析candump实时数据流

Linux命令行玩转CAN总线:像查日志一样用grep分析candump实时数据流 在Linux系统管理领域,日志分析是每个开发者都熟悉的日常操作。当面对CAN总线这样的专业数据流时,其实可以运用同样的思维——将candump视为持续输出的数据源,用g…...

保姆级教程:在Windows上用CMake搞定Qt 6.5与WebRTC M114的集成(附完整代码)

Windows平台Qt 6.5与WebRTC M114深度集成实战指南 环境准备与工具链配置 在Windows平台上进行Qt与WebRTC的集成开发,首先需要搭建完整的工具链环境。不同于简单的库引用,这种深度集成对工具版本和系统配置有着严格要求。 必备组件清单: Visua…...

从数据采集到图表显示:LabVIEW数组在温度监控项目中的实战应用

从数据采集到图表显示:LabVIEW数组在温度监控项目中的实战应用 温度监控系统是工业自动化领域的常见需求,无论是实验室环境监测还是生产线温度控制,都需要实时采集、处理和可视化温度数据。LabVIEW作为图形化编程的标杆工具,其数组…...

2026年运动木地板厂家口碑排行榜,谁是真正王者?

随着体育产业的蓬勃发展,运动木地板的需求日益增长。作为体育场馆的重要组成部分,运动木地板的质量直接影响到运动员的表现和观众的体验。那么,在众多运动木地板厂家中,哪家才是真正的王者呢?本文将从产品质量、工艺技…...

实战分享:如何将YOLOv8+TensorRT推理引擎封装成DLL,并在Qt 5.9.9项目中轻松调用(附完整源码)

工业级视觉方案:YOLOv8模型TensorRT加速与Qt跨平台集成实战 在智能制造和嵌入式视觉领域,如何将训练好的深度学习模型高效部署到实际应用中一直是工程师面临的挑战。本文将详细介绍从YOLOv8模型转换到最终Qt应用集成的全流程,重点解决Windows…...

R3nzSkin国服特供版:免费体验英雄联盟全皮肤终极指南

R3nzSkin国服特供版:免费体验英雄联盟全皮肤终极指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 还在为英雄联盟皮肤价格昂贵而烦恼吗&…...

推理服务为什么一上自动 Prompt 优化就开始成本失控:从 Prompt 版本爆炸到在线 A/B 收敛的工程实战

一、自动 Prompt 优化的成本幻觉 不少团队上线推理服务后,发现同一任务换句 Prompt 输出质量可提升 20%。🚀 自动 Prompt 优化因此成了香饽饽——系统同时维护几十个版本在线分流。但两周后账单涨了 40%。⚡️ 问题不在 Prompt,而是版本爆炸把…...

AI Agent的协作竞争机制:多智能体博弈与协调

AI Agent的协作竞争机制:多智能体博弈与协调 本文面向中级AI算法工程师、软件架构师与AI产品经理,深度解析多智能体系统的核心原理、博弈机制、协调算法与落地实践,帮助读者掌握下一代AI系统的设计方法论。 一、核心概念与问题背景 1.1 核心概念定义 我们首先明确全文的核…...

别再死记硬背了!用Python/JavaScript/C++对比理解‘整型变布尔’的底层逻辑

别再死记硬背了!用Python/JavaScript/C对比理解‘整型变布尔’的底层逻辑 在编程语言的学习过程中,类型系统是最基础也最容易被忽视的部分。特别是当开发者从一门动态类型语言转向静态类型语言时,经常会遇到一些"反直觉"的类型转换…...

5步掌握AlienFX Tools:开源Alienware控制的终极指南

5步掌握AlienFX Tools:开源Alienware控制的终极指南 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 厌倦了Alienware Command Center&#…...