logo

Vue3常用组合式API精解:10大核心函数全攻略

作者:热心市民鹿先生2025.09.19 13:43浏览量:0

简介:本文深度解析Vue3中最常用的10个组合式API,涵盖响应式控制、生命周期、依赖注入等核心场景,通过代码示例和实用技巧帮助开发者高效掌握Composition API精髓。

Vue3常用组合式API精解:10大核心函数全攻略

Vue3的组合式API(Composition API)通过逻辑复用和更灵活的代码组织方式,彻底改变了前端开发范式。本文将系统梳理10个最常用的组合式API,从基础响应式控制到高级状态管理,结合实际开发场景提供深度解析。

一、响应式控制核心三件套

1. ref():基础响应式容器

ref是创建响应式数据的最小单元,通过.value访问内部值。其独特之处在于可包装任意类型数据,包括基本类型和对象。

  1. import { ref } from 'vue'
  2. const count = ref(0)
  3. const user = ref({ name: 'Alice' })
  4. // 修改值必须通过.value
  5. count.value++
  6. user.value.name = 'Bob'

最佳实践:在模板中自动解包,无需写.value;在JSX或计算属性中需显式访问。对于对象类型,优先考虑reactive()

2. reactive():深度响应式对象

创建完全响应式的对象,所有嵌套属性都会被深度监听。与ref不同,它不需要.value访问。

  1. const state = reactive({
  2. user: { name: 'Alice' },
  3. items: []
  4. })
  5. // 直接修改属性
  6. state.user.name = 'Bob'
  7. state.items.push(1)

注意事项:解构会丢失响应性,需使用toRefs解构:

  1. const { user } = toRefs(state)
  2. // 现在user是响应式的ref对象

3. computed():响应式计算属性

基于现有响应式数据创建派生状态,具有缓存机制。

  1. const count = ref(1)
  2. const double = computed(() => count.value * 2)
  3. // 带setter的计算属性
  4. const fullName = computed({
  5. get: () => firstName.value + ' ' + lastName.value,
  6. set: (newValue) => {
  7. [firstName.value, lastName.value] = newValue.split(' ')
  8. }
  9. })

性能优化:复杂计算应考虑使用watchEffectwatch替代。

二、生命周期与副作用控制

4. onMounted():组件挂载钩子

替代Options API的mounted,在DOM挂载完成后执行。

  1. import { onMounted } from 'vue'
  2. export default {
  3. setup() {
  4. onMounted(() => {
  5. console.log('组件已挂载')
  6. // 初始化第三方库等操作
  7. })
  8. }
  9. }

组合使用:常与onBeforeUnmount配对使用清理资源:

  1. let timer
  2. onMounted(() => {
  3. timer = setInterval(() => {}, 1000)
  4. })
  5. onBeforeUnmount(() => clearInterval(timer))

5. watchEffect():自动追踪依赖

自动追踪回调函数中使用的响应式依赖,当依赖变化时重新执行。

  1. const count = ref(0)
  2. const data = ref(null)
  3. watchEffect(async () => {
  4. // 自动追踪count变化
  5. const response = await fetch(`/api?count=${count.value}`)
  6. data.value = await response.json()
  7. })

与watch的区别watchEffect不需要显式指定依赖,但无法获取旧值。需要旧值时使用watch

6. watch():精确响应式监听

监听特定响应式数据的变化,可获取新旧值。

  1. const count = ref(0)
  2. const name = ref('')
  3. // 监听单个源
  4. watch(count, (newVal, oldVal) => {
  5. console.log(`count${oldVal}变为${newVal}`)
  6. })
  7. // 监听多个源
  8. watch([count, () => name.value], ([newCount, newName], [oldCount, oldName]) => {
  9. // 处理变化
  10. })

深度监听:对对象监听需设置deep: true

  1. const user = reactive({ name: 'Alice' })
  2. watch(() => user, (newVal) => {
  3. // 深度监听对象变化
  4. }, { deep: true })

三、状态管理与依赖注入

7. provide() / inject():跨组件通信

实现祖先组件向后代组件传递数据,无需逐层传递props。

  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'

响应式控制:提供ref时,注入方会自动获得响应性。如需修改,可在祖先组件提供方法:

  1. provide('theme', {
  2. value: ref('dark'),
  3. setTheme: (newTheme) => { theme.value = newTheme }
  4. })

8. shallowRef():浅层响应式

创建只对.value本身响应的ref,不深度监听内部变化。

  1. const largeObject = shallowRef({ nested: { /* 大量数据 */ } })
  2. // 修改.value会触发更新
  3. largeObject.value = newObject
  4. // 修改嵌套属性不会触发更新
  5. largeObject.value.nested.prop = newValue // 无响应

性能场景:适用于大型不可变数据或明确不需要深度监听的场景。

四、实用工具API

9. toRefs():解构响应式对象

将reactive对象的每个属性转为ref,保持响应性。

  1. const state = reactive({
  2. count: 0,
  3. name: 'Alice'
  4. })
  5. // 解构后保持响应性
  6. const { count, name } = toRefs(state)
  7. // 现在count和name都是ref对象
  8. count.value++

toRef的区别toRef用于创建单个属性的ref,toRefs用于批量解构。

10. customRef():自定义响应式

实现完全控制的响应式引用,适用于防抖、节流等场景。

  1. function useDebouncedRef(value, delay = 200) {
  2. let timeout
  3. return customRef((track, trigger) => {
  4. return {
  5. get() {
  6. track()
  7. return value
  8. },
  9. set(newValue) {
  10. clearTimeout(timeout)
  11. timeout = setTimeout(() => {
  12. value = newValue
  13. trigger()
  14. }, delay)
  15. }
  16. }
  17. })
  18. }
  19. const debouncedText = useDebouncedRef('')

实现原理:通过tracktrigger手动控制依赖追踪和更新通知。

高级实践建议

  1. 组合函数封装:将相关API组合成自定义hook,如useFetch封装ref+watchEffect+错误处理
  2. 性能监控:使用onRenderTrackedonRenderTriggered调试不必要的响应式依赖
  3. TypeScript集成:为自定义组合式API添加类型声明,提升代码可维护性
  4. SSR优化onServerPrefetchclientOnly配合处理服务端渲染场景

总结

这10个组合式API构成了Vue3响应式系统的核心骨架。从基础的ref/reactive到高级的customRef,每个API都针对特定场景提供了优雅的解决方案。掌握它们不仅能提升开发效率,更能深入理解Vue3的响应式原理。建议开发者通过实际项目练习,逐步构建自己的组合式API工具库。

相关文章推荐

发表评论