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

vue3 组合式 API 详解

一、什么是组合式 API(Composition API)?

Composition API 是 Vue 3 引入的一套新的组件编写方式
它的核心思想是:

按“逻辑”组织代码,而不是按“选项(data / methods / computed ...)”组织代码。

传统 Options API 的代码是分散的,而 Composition API 把相关逻辑集中写在一起,更利于可维护、可拆分、可复用。


二、为什么要使用 Composition API?

1. 逻辑集中,不再分散在各个选项里

例如一个功能需要 data、methods、watch、computed
在 Options API 中会分散在不同的块:

  • data()

  • computed

  • methods

  • watch

而 Composition API 中可以集中放在 setup() 中。

2. 更强的逻辑复用(不再被 mixins 限制)

使用**组合函数(Composables)**可以像 React Hooks 一样复用逻辑。

3. 更适合 TypeScript

Composition API 更符合 TS 类型推断。

4. 更利于代码压缩与 tree-shaking

未使用的函数不会被打包。


三、Composition API 核心功能总览

功能作用
setup()组合式 API 的入口
ref()定义基本类型响应式数据
reactive()定义对象响应式数据
computed()定义计算属性
watch()侦听数据变化
watchEffect()自动依赖追踪的侦听器
生命周期钩子如 onMounted/onUnmounted
provide/inject组件通信(依赖注入)
defineProps / defineEmits单文件组件 SFC 中使用

四、Composition API 最重要的:setup()

Vue 3 组件使用 Composition API 时,逻辑基本写在 setup() 中:

<script setup>
import { ref, reactive, computed, watch, onMounted } from 'vue'const count = ref(0)function increment() {count.value++
}onMounted(() => {console.log('组件已挂载')
})
</script><template><button @click="increment">{{ count }}</button>
</template>

setup() 的特点

  • 在组件创建之前执行

  • 不能访问 this(与 Options API 完全不同)

  • 返回的变量和方法才能在模板中使用


五、ref() —— 定义基本类型响应式数据

const count = ref(0)

ref 定义的变量需要通过 .value 访问:

count.value++
console.log(count.value)

六、reactive() —— 定义对象响应式数据

const state = reactive({name: 'Tom',age: 18
})

reactive 定义的对象不需要 .value

state.age++

注意:reactive 只能用于对象

  • 对基本类型无效(要用 ref)


ref vs reactive 对比

refreactive
可用于基本类型只能用于对象
必须用 .value不需要 .value
可以包装对象,但会变成嵌套直接生成 Proxy 对象

七、computed() —— 定义计算属性

const firstName = ref('Tom')
const lastName = ref('Jerry')const fullName = computed(() => {return firstName.value + ' ' + lastName.value
})

支持 getter / setter:

const fullName = computed({get() {return firstName.value + ' ' + lastName.value},set(value) {const parts = value.split(' ')firstName.value = parts[0]lastName.value = parts[1]}
})

八、watch 和 watchEffect

watch:指定侦听目标

watch(count, (newVal, oldVal) => {console.log('变化:', newVal)
})

侦听多个:

watch([count, firstName], ([newCount, newName]) => {console.log(newCount, newName)
})

watchEffect:自动依赖收集

不需要指定侦听目标:

watchEffect(() => {console.log('count is:', count.value)
})

适合副作用操作。


九、生命周期函数(组合式写法)

组合式 API 的生命周期函数全部以 onXxx 命名。

Options APIComposition API
created无(使用 setup 代替)
mountedonMounted
updatedonUpdated
unmountedonUnmounted
beforeMountonBeforeMount
beforeUpdateonBeforeUpdate
beforeUnmountonBeforeUnmount

示例:

onMounted(() => {console.log('组件挂载了')
})

十、组件通信:props / emits

1. <script setup> 中使用 defineProps

<script setup>
const props = defineProps({title: String,age: Number
})
</script>

2. Emits

<script setup>
const emit = defineEmits(['update'])function sendData() {emit('update', 123)
}
</script>

十一、组合逻辑复用:自定义组合函数(Composables)

可把可复用的逻辑抽成“函数”,像 React Hooks 一样。

示例:封装一个计数器逻辑

文件:useCounter.js

import { ref } from 'vue'export function useCounter() {const count = ref(0)const inc = () => count.value++const dec = () => count.value--return { count, inc, dec }
}

使用:

<script setup>
import { useCounter } from './useCounter'const { count, inc, dec } = useCounter()
</script><template><button @click="dec">-</button>{{ count }}<button @click="inc">+</button>
</template>

十二、Composition API 与 Options API 对比总结

对比项Options APIComposition API
代码结构按 data/methods/watch 分散逻辑集中,清晰
逻辑复用mixins 有命名冲突composables 优秀
TypeScript 支持较差非常友好
可维护性大型项目易混乱更清晰结构化
新手学习成本略高

🔥 十三、完整示例:计数器 + 计算属性 + watch

<script setup>
import { ref, computed, watch, onMounted } from 'vue'const count = ref(0)const double = computed(() => count.value * 2)watch(count, (n, o) => {console.log(`count: ${o} -> ${n}`)
})function inc() {count.value++
}onMounted(() => {console.log('组件挂载')
})
</script><template><h1>Count: {{ count }}</h1><h2>Double: {{ double }}</h2><button @click="inc">增加</button>
</template>

http://www.dtcms.com/a/611028.html

相关文章:

  • C++从入门到实战----类和对象(上)
  • 多维度表征(下)|用扫描电镜,CT 与仿真“看透“再生碳纤维复合材料
  • 电商网站 收费与免费wordpress阿里云图片不显示不出来
  • 易语言模块反编译为源码 | 深入分析与实战教程
  • 在高速公路或交通工程领域中,OD 是 Origin-Destination 的缩写,中文通常称为“起讫点”或“出行起止点”。
  • 诏安建设局网站常德网站seo
  • 牛商网做的网站怎么样仓库进销存软件
  • Windows 7 运行 .NET 应用时报错“hostfxr.dll 加载失败 (HRESULT: 0x80070057)”的彻底解决指南
  • 免费手机网站系统WordPress使用中文链接好吗
  • 深入理解 C++ vector 源码与迭代器失效问题
  • 服务器主板选用网络变压器及参数配置HX82409S
  • 厦门网站建设企业网站的邀请怎么做的
  • 单独Docker部署和Docker Compose部署
  • 推动“AI+ 网络安全”深度融合与创新发展
  • 个人网站开发技术网站如何做免费推广
  • 网站建设惠州房屋室内设计用什么软件
  • oracle 12c查看执行过的sql及当前正在执行的sql
  • bulk转录组测序分析之数据清洗
  • 深圳网站的公司做网站大概需要多少钱
  • 建立门户公司网站郑州 网站建设
  • MySQL 配置文件属性详解
  • chunk_overlap(通常译为“分块重叠度”)
  • CSFAFormer:用于多模态遥感图像语义分割的类别选择性特征聚合 Transformer
  • 国外网站制作有哪些常州网站建设青之峰
  • 创建网站收费双语cms网站
  • 信息系统安全-第六章-操作系统安全-2.Windows安全技术
  • 数据结构--7:排序(Sort)
  • C语言编译器菜鸟教程 | 学习C语言编程的入门指南
  • LINUX的dns主从服务
  • 做爰直播网站高端前端开发