Vue.js 组件系统是使 Vue 应用程序中组件的创建、管理和生命周期成为可能的核心架构基础。本文档详细介绍了 Vue.js 运行时核心内部组件的定义、实例化和管理方式。
有关 Props 和 Emit 系统实现的具体信息,请参阅 Props 和 Emit 系统。
组件系统为组件定义(通过 Options API 或 Composition API)、创建组件实例、管理组件生命周期以及通过响应式系统处理组件更新提供了基础架构。
来源
Vue 组件可以通过多种方式定义,分为两大类:有状态组件和函数式组件。
有状态组件维护内部状态并拥有完整的组件生命周期。它们可以通过
data、methods、computed 等选项的对象来定义。setup() 函数,该函数返回一个响应式状态对象或一个渲染函数。函数式组件是无状态的,没有生命周期,并且主要是带有 props 的渲染函数。
来源
组件实例的创建过程涉及几个关键步骤
来源
Vue 组件的生命周期通过一系列钩子函数来管理,这些钩子函数在组件生命周期的特定时间点被调用。
Vue 组件有许多生命周期钩子,它们在不同阶段被调用
| 钩子 | 时间点 |
|---|---|
beforeCreate | 实例初始化之前 |
created | 实例创建后,挂载之前 |
beforeMount | DOM 挂载开始之前 |
mounted | 组件挂载到 DOM 之后 |
beforeUpdate | 由于状态更改导致组件更新之前 |
updated | 组件更新之后 |
beforeUnmount | 组件从 DOM 移除之前 |
unmounted | 组件从 DOM 移除之后 |
activated | keep-alive 组件激活时 |
deactivated | keep-alive 组件停用时 |
errorCaptured | 捕获到子组件的错误时 |
renderTracked | 渲染过程中跟踪到响应式依赖时 |
renderTriggered | 响应式依赖触发重新渲染时 |
来源
组件在内部由 ComponentInternalInstance 接口表示,该接口包含创建、渲染和管理组件在其生命周期中的所有必要信息。
ComponentInternalInstance 的主要属性uid:组件的唯一标识符type:组件定义(选项对象或函数)parent:父组件实例root:根组件实例vnode:代表此组件的虚拟节点subTree:组件渲染树的根虚拟节点setupState:setup() 函数返回的状态props:组件 propsattrs:非 prop 属性slots: 组件插槽emit: 用于触发事件的方法render:渲染函数proxy:公共实例代理(在 methods 中作为 this 访问)来源
Vue 为每个组件实例创建一个代理,为用户代码提供友好的界面与组件交互。当你通过 this 访问组件方法时,就是访问这个代理。
组件的公共实例公开属性,例如
$el:根 DOM 元素$props:组件 props$attrs:非 prop 属性$slots:组件插槽$parent:父组件$root:根组件$emit:发出事件的方法$nextTick:访问 Vue 的 nextTick 工具$forceUpdate:手动触发组件更新所有这些都通过一个 Proxy 访问,该 Proxy 负责确定属性是来自 props、data、computed、methods 等。
来源
setup 函数是 Composition API 的入口点。它接收 props 和 context 作为参数,并可以返回一个渲染函数或一个响应式状态对象。
来源
组件与 Vue 的响应式系统深度集成,这使得在响应式状态发生变化时能够自动更新。
来源
组件可以全局注册或本地注册,然后可以在模板中使用。
来源
组件的挂载过程包括创建实例、设置实例并将其渲染到 DOM。
来源
Vue 的组件系统包含一些高级功能
函数式组件是标准组件的轻量级替代方案
来源
Vue 支持异步组件,这些组件可以按需加载
这允许代码拆分和组件的延迟加载。
来源
Vue 的组件系统提供了一种灵活而强大的方式来使用可重用组件构建应用程序。该系统支持不同的组件定义风格(Options API vs Composition API),管理组件生命周期,处理 props 和事件,并与 Vue 的响应式系统集成以实现高效更新。
该系统的架构支持异步组件、函数式组件和特殊内置组件等功能,同时通过虚拟 DOM diff 算法提供性能优化。