logo

Vue3组合式API精解:十大核心函数详析

作者:Nicky2025.09.18 18:04浏览量:0

简介:本文深度解析Vue3中最常用的10个组合式API,涵盖响应式控制、生命周期、依赖注入等核心功能,通过代码示例和场景分析帮助开发者快速掌握组合式编程范式。

Vue3组合式API精解:十大核心函数详析

Vue3的组合式API(Composition API)通过逻辑复用和更灵活的代码组织方式,彻底改变了Vue应用的开发模式。本文将深入解析10个最常用的组合式API,从基础响应式到高级依赖注入,结合实际场景和代码示例,帮助开发者系统掌握组合式编程范式。

一、响应式控制核心API

1. ref:创建响应式引用

ref是组合式API的基础构建块,用于创建可响应的单一值引用。其核心特性包括:

  1. import { ref } from 'vue'
  2. const count = ref(0) // 创建响应式数字
  3. const text = ref('') // 创建响应式字符串
  4. // 修改值必须通过.value
  5. function increment() {
  6. count.value++
  7. }

在模板中,ref会自动解包,无需.value访问。适用于表单输入、计数器等简单状态管理。建议将ref与类型定义结合使用(TypeScript环境下):

  1. const userAge = ref<number>(25)

2. reactive:创建响应式对象

reactive用于创建深层响应式的对象,特别适合管理复杂状态:

  1. import { reactive } from 'vue'
  2. const state = reactive({
  3. user: {
  4. name: 'Alice',
  5. age: 30
  6. },
  7. preferences: {
  8. theme: 'dark'
  9. }
  10. })
  11. // 深层响应式
  12. function updateUser() {
  13. state.user.name = 'Bob' // 自动触发更新
  14. state.preferences.theme = 'light'
  15. }

注意:reactive对象解构后会失去响应性,如需解构应使用toRefs

  1. import { toRefs } from 'vue'
  2. const { user, preferences } = toRefs(state)

3. computed:创建计算属性

computed提供响应式依赖的计算值,具有缓存特性:

  1. import { computed, ref } from 'vue'
  2. const price = ref(100)
  3. const quantity = ref(2)
  4. const total = computed(() => price.value * quantity.value)
  5. // 带写入的计算属性
  6. const discountedPrice = computed({
  7. get: () => price.value * 0.9,
  8. set: (newValue) => {
  9. price.value = newValue / 0.9
  10. }
  11. })

计算属性在依赖不变时不会重复计算,适合处理复杂逻辑的派生状态。

二、生命周期与副作用管理

4. onMounted:组件挂载钩子

onMounted是组合式API中最常用的生命周期钩子,替代Options API的mounted

  1. import { onMounted } from 'vue'
  2. export default {
  3. setup() {
  4. onMounted(() => {
  5. console.log('组件已挂载')
  6. // 执行DOM操作或数据初始化
  7. })
  8. }
  9. }

nextTick结合可确保DOM更新完成:

  1. import { nextTick } from 'vue'
  2. onMounted(async () => {
  3. await nextTick()
  4. const element = document.getElementById('target')
  5. // 安全操作DOM
  6. })

5. watch & watchEffect:响应式监听

watchwatchEffect提供精细的响应式依赖追踪:

  1. import { watch, watchEffect, ref } from 'vue'
  2. const count = ref(0)
  3. const double = computed(() => count.value * 2)
  4. // 精确监听特定ref
  5. watch(count, (newVal, oldVal) => {
  6. console.log(`count变化: ${oldVal} -> ${newVal}`)
  7. })
  8. // 自动追踪依赖
  9. watchEffect(() => {
  10. console.log(`double值: ${double.value}`)
  11. // 会自动追踪double.value的依赖
  12. })

watch适合需要新旧值对比的场景,watchEffect适合立即执行的副作用。

三、依赖注入与上下文管理

6. provide & inject:跨组件通信

组合式API中的provide/inject提供了更灵活的依赖注入机制:

  1. // 父组件
  2. import { provide, ref } from 'vue'
  3. const theme = ref('dark')
  4. provide('theme', theme)
  5. // 子组件
  6. import { inject } from 'vue'
  7. const theme = inject('theme', 'light') // 默认值'light'

结合响应式对象可实现动态主题切换:

  1. // 父组件
  2. provide('themeSettings', reactive({
  3. theme: 'dark',
  4. fontSize: 16
  5. }))
  6. // 子组件
  7. const { theme, fontSize } = inject('themeSettings')

7. useContext:访问组件上下文

在自定义组合函数中,可通过getCurrentInstance访问组件上下文(Vue3.3+推荐使用useContext替代):

  1. import { getCurrentInstance } from 'vue'
  2. export function useLogger() {
  3. const instance = getCurrentInstance()
  4. return {
  5. log: (message) => {
  6. if (instance?.proxy) {
  7. console.log(`[${instance.proxy.$options.name}] ${message}`)
  8. }
  9. }
  10. }
  11. }

注意:在SSR环境中需谨慎使用上下文访问。

四、高级功能组合

8. onBeforeUnmount:清理资源

组合式API中的资源清理钩子:

  1. import { onBeforeUnmount } from 'vue'
  2. export default {
  3. setup() {
  4. const timer = setInterval(() => {
  5. console.log('心跳检测')
  6. }, 5000)
  7. onBeforeUnmount(() => {
  8. clearInterval(timer) // 必须清理
  9. })
  10. }
  11. }

适用于事件监听器、定时器、WebSocket连接等资源的释放。

9. customRef:自定义响应式引用

customRef提供对ref行为的完全控制:

  1. import { customRef } from 'vue'
  2. function useDebouncedRef(value, delay = 200) {
  3. let timeout
  4. return customRef((track, trigger) => {
  5. return {
  6. get() {
  7. track()
  8. return value
  9. },
  10. set(newValue) {
  11. clearTimeout(timeout)
  12. timeout = setTimeout(() => {
  13. value = newValue
  14. trigger()
  15. }, delay)
  16. }
  17. }
  18. })
  19. }
  20. // 使用防抖ref
  21. const searchQuery = useDebouncedRef('')

适用于输入防抖、节流等场景。

10. Suspense相关API:异步组件控制

Vue3的Suspense组件配合组合式API处理异步依赖:

  1. // AsyncComponent.vue
  2. import { defineAsyncComponent } from 'vue'
  3. const AsyncComp = defineAsyncComponent(() =>
  4. import('./HeavyComponent.vue')
  5. )
  6. // 父组件中使用Suspense
  7. <template>
  8. <Suspense>
  9. <template #default>
  10. <AsyncComp />
  11. </template>
  12. <template #fallback>
  13. <div>加载中...</div>
  14. </template>
  15. </Suspense>
  16. </template>

组合式API中可通过resolveComponent动态加载组件:

  1. import { resolveComponent } from 'vue'
  2. const compName = ref('AsyncComp')
  3. const DynamicComp = computed(() => resolveComponent(compName.value))

最佳实践建议

  1. 状态组织:按逻辑而非组件结构组织代码,使用setup()函数或<script setup>语法
  2. 类型安全:为ref和reactive对象添加TypeScript类型定义
  3. 性能优化:对频繁更新的计算属性使用shallowRefshallowReactive
  4. 组合函数:将通用逻辑封装为可复用的组合函数(如useFetchuseLocalStorage
  5. SSR兼容:避免在服务端渲染时访问浏览器API

通过系统掌握这10个核心组合式API,开发者能够构建出更模块化、可维护的Vue3应用。组合式API的灵活性尤其适合中大型项目的开发,建议结合Vue Devtools进行状态调试和性能分析。

相关文章推荐

发表评论