Vue.js 2.7 中的组合式 API 是从 Vue 3 回源的功能,它提供了一种组织组件逻辑的新方式。它允许开发者根据逻辑关注点而非选项类型来分组代码,从而使大型组件更易于维护,并实现在组件之间更好地复用代码。本页面记录了 Vue 2.7 中组合式 API 的实现,以及它如何与 Vue 现有的选项式 API 集成。
有关 EffectScope 和增强的响应性功能的信息,请参阅EffectScope 和响应性。
组合式 API 引入了一个新的setup() 组件选项,作为使用组合式 API 功能的入口点。在setup() 函数内部,你可以使用各种响应性 API,例如ref、reactive 和computed 来创建响应式状态,并使用生命周期钩子,例如onMounted 和onUpdated。
来源
setup 函数在组件创建之前执行,一旦 props 被解析。它作为组件内组合式 API 的入口点。
props:包含已解析 props 的响应式对象context:包含有用属性的对象setup 函数接收一个上下文对象,包含以下属性
| 属性 | 描述 |
|---|---|
attrs | 传递给组件的非 prop 属性 |
slots | 组件插槽 |
emit | 用于触发自定义事件的方法 |
expose | 用于向父组件暴露属性的函数 |
listeners | 事件监听器 (仅限 Vue 2) |
来源
setup 函数被集成到 Vue 现有的初始化流程中。它在initState 阶段被调用,在beforeCreate 钩子之后,但在数据、方法和计算属性初始化之前。
来源
initSetup 函数处理组件的setup 选项的执行
来源
组合式 API 使用了从 Vue 3 回源到 Vue 2.7 的响应性系统。它利用了新的ref、reactive、computed 以及其他响应性 API。
实现中一个重要的方面是 ref 的自动解包。当setup 返回值中的属性在模板中或通过this 访问时,ref 会自动解包为它们的内部值。
来源
Vue 2.7 的组合式 API 使用EffectScope 类来管理和清理响应式副作用。每个组件实例在初始化期间都会创建一个 effect scope,它用于在组件卸载时收集并自动清理所有响应式副作用。
来源
Vue 2.7 提供了几个辅助函数,用于在组合式函数内部访问 setup 上下文的部分内容
| 功能 | 描述 |
|---|---|
useSlots() | 访问组件的插槽 |
useAttrs() | 访问非 prop 属性 |
useListeners() | 访问事件监听器(仅限 Vue 2) |
getCurrentInstance() | 访问当前组件实例 |
来源
在setup 函数中定义的属性会与选项式 API 中的属性合并。如果存在命名冲突
setup 和其他选项中定义,则setup 版本优先_ 或$ 开头的属性是保留的,如果在 setup 中使用,将生成警告来源
来源
setup 函数也可以返回一个渲染函数
来源
传递给setup 函数的 Props 是响应式的,但不应直接修改,因为这会违反单向数据流原则。
在setup 函数本身中访问的所有响应式数据不会导致组件更新。跟踪仅发生在setup 函数内部创建的函数中。
来源
组合式 API 在设计时考虑了 TypeScript,并且与选项式 API 相比提供了更好的类型推断。
来源
Vue 2.7 中的组合式 API 提供了一种向前兼容的方式,以更灵活和可复用的方式组织组件逻辑。它与选项式 API 并存,允许开发者在现有应用中逐步采用它,或者在它能带来益处的特定复杂组件中使用它。
通过使用组合式 API,开发者可以更好地组织相关代码,在组件之间创建可复用的逻辑,并从改进的 TypeScript 支持中受益。