前言
大学前端入门学的vue2,工作了又用的React,现在想学习一下Vue3,开篇就介绍了组合式API,这和我认知里的vue2的选项式API区别还是蛮大的。本篇文章简单介绍一下组合式API。
什么是组合式API
Vue 3引入了一种新的 API,称为“组合式 API”(Composition API)。与以前的选项式 API 不同,组合式 API 允许开发者将代码组织成逻辑相关的功能块,而不是按照选项的生命周期钩子来组织。这使得代码更加灵活、可维护,并且更容易重用。
组合式 API 的核心特性是 setup
函数,它是在组件实例创建之前被调用的。setup
函数返回一个对象,该对象中包含了在组件中使用的响应式数据、计算属性、方法等。
举个简单的例子来看看这么用:
<template> <div> <p>{{ message }}</p> <button @click="reverseMessage">Reverse Message</button> </div> </template> <script> import { ref } from 'vue'; export default { setup() { // 使用 ref 创建响应式数据 const message = ref('Hello, Vue!'); // 定义一个方法 const reverseMessage = () => { message.value = message.value.split('').reverse().join(''); }; // 返回组件实例中需要用到的数据和方法 return { message, reverseMessage }; } }; </script>
在这个例子中,setup
函数中使用了 ref
函数创建了一个名为 message
的响应式数据,并定义了一个 reverseMessage
方法。在模板中,通过 {{ message }}
显示了这个响应式数据,并通过 @click
绑定了按钮的点击事件。
组合式 API 还提供了其他一些函数,例如 reactive
用于创建响应式对象,computed
用于创建计算属性,以及一些生命周期钩子函数,如 onMounted
、onUpdated
、onUnmounted
等。通过这些函数,你可以更加灵活地组织和管理你的组件逻辑。
组合式 API 的引入让 Vue 更适用于大型应用和更复杂的场景,同时保持了简单性和可读性。
什么又是选项式API
选项式 API(Options API)是 Vue 2 中的主要 API,它使用对象来定义组件的选项。选项式API在简单的应用中直观和易用,但当应用逻辑变得复杂时,组件可能会包含大量的选项,导致组件定义变得冗长且难以维护。
在 Vue 2 中,一个组件的定义通常包括以下选项:
data
选项用于定义组件的数据。props
参数, 用于接收父组件传递的数据。methods
选项用于定义组件的方法。watch
监听属性。computed
用于定义计算属性。计算属性是基于响应式数据计算而来的属性,具有缓存机制,只在相关依赖发生变化时才重新计算。created、mounted、updated、destroyed
:生命周期钩子,用于在组件的不同生命周期阶段执行相应的操作。还有其他选项,这里就不一一列举了,这些选项将一起形成一个对象,作为 Vue 组件的定义。
export default { data() { return { message: 'Hello, Vue!' }; }, watch: { 'someData': function(newVal, oldVal) { // 处理变化 } }, computed: { fullName() { return this.firstName + ' ' + this.lastName; } }, methods: { reverseMessage() { this.message = this.message.split('').reverse().join(''); } }, template: ` <div> <p>{{ message }}</p> <button @click="reverseMessage">Reverse Message</button> </div> ` };
组合式API的优势
组合式 API 相对于选项式 API 具有一些优点,尤其在处理复杂组件和大型应用时。
- 更灵活的组织结构: 组合式 API 允许你通过逻辑相关的功能块来组织代码,而不是按照生命周期钩子和选项的方式来组织。这使得代码更具可读性和可维护性。
- 更好的代码复用: 组合式 API 支持将逻辑提取到可复用的函数中,使得这些逻辑可以在不同组件之间共享。这有助于减少重复代码,提高代码的可维护性。
- 更好的 TypeScript 支持: 组合式 API 在 TypeScript 中的支持更好,因为它提供了更明确的类型推断和更容易推导的类型。这有助于减少潜在的类型错误,并提高代码的稳定性。
- 更好的响应性处理: 组合式 API 中的响应式函数(如
ref
和reactive
)使得数据的响应式处理更加直观。通过ref
和reactive
,你可以明确地声明哪些数据是响应式的,而不需要依赖于 Vue 2 中的data
选项。 - 更清晰的生命周期: 组合式 API 中的生命周期钩子是通过函数来定义的,而不是作为选项来定义的。这使得生命周期钩子的顺序更加清晰,易于理解。
- 更好的逻辑复杂性处理: 对于复杂的业务逻辑,组合式 API 允许将逻辑拆分为小的功能块,每个功能块都有其自己的状态和方法。这降低了理解和维护复杂组件的难度。
相比React Hooks
Vue 3 的组合式 API 与 React 的 Hooks 在某些概念上有一些相似之处,因为它们都是为了解决在函数式组件中复用逻辑的问题。然而,它们在具体实现和一些概念上有一些区别。
相似之处
- 函数式组件: 组合式 API 和 React Hooks 都是为了函数式组件而设计的。它们让你在不使用类组件的情况下,能够在组件之间共享和复用逻辑。
- 逻辑复用: 两者的目标都是使逻辑能够在组件之间进行复用,而不必依赖于继承的方式。
区别
组合式 API 和 React Hooks 都是为了解决在函数式组件中复用逻辑的问题,但它们在具体实现和使用方式上有一些不同。熟悉其中一个并不会让你自动熟悉另一个,但它们共同推动了前端开发中对于更灵活和可维护组件的需求。
- API 设计:
- 组合式 API: Vue 3 的组合式 API 使用
setup
函数,并通过返回一个对象来暴露组件内部的状态和方法。 - React Hooks: React 的 Hooks 使用一系列以 "use" 开头的函数(如
useState
、useEffect
等),通过这些函数来管理状态和副作用。
- 响应式系统:
- 组合式 API: Vue 3 的组合式 API 使用
ref
、reactive
等函数来创建响应式数据。 - React Hooks: React 使用
useState
来管理状态,但它的响应式系统不同于 Vue,是基于不可变性的原则。
- 生命周期:
- 组合式 API: Vue 3 中使用
onMounted
、onUpdated
、onUnmounted
等函数来处理生命周期事件。 - React Hooks: React 使用
useEffect
来处理副作用,而不像 Vue 3 中的生命周期钩子那样区分不同的阶段。
- 上下文传递:
- 组合式 API: Vue 3 中可以使用
provide
和inject
在组件树中传递数据。 - React Hooks: React 使用
Context
来实现组件树中的数据传递。
- TypeScript 支持:
- 组合式 API: 组合式 API 在 TypeScript 中的支持相对较好,类型推断更直观。
- React Hooks: React Hooks 也能在 TypeScript 中使用,但需要一些额外的类型声明。
对于使用那种,根据项目和团队喜好决定。官网也说了选项式API不会被放弃,选项式 API 也是 Vue 不可分割的一部分,也有很多开发者喜欢它。我们也意识到组合式 API 更适用于大型的项目,而对于中小型项目来说选项式 API 仍然是一个不错的选择。