选项:生命周期
另请参阅
有关生命周期钩子的共享用法,请参阅 指南 - 生命周期钩子
beforeCreate
在实例初始化时调用。
类型
tsinterface ComponentOptions { beforeCreate?(this: ComponentPublicInstance): void }详情
在实例初始化并解析 props 时立即调用。
然后,props 将被定义为响应式属性,
data()或computed等状态也将被设置。请注意,Composition API 的
setup()钩子会在任何 Options API 钩子之前调用,甚至早于beforeCreate()。
created
在实例完成所有与状态相关的选项处理后调用。
类型
tsinterface ComponentOptions { created?(this: ComponentPublicInstance): void }详情
调用此钩子时,以下内容已经完成设置:响应式数据、计算属性、方法和侦听器。不过,挂载阶段尚未开始,
$el属性此时还不可用。
beforeMount
在组件即将挂载之前调用。
类型
tsinterface ComponentOptions { beforeMount?(this: ComponentPublicInstance): void }详情
调用此钩子时,组件已经完成其响应式状态的设置,但尚未创建任何 DOM 节点。它即将首次执行 DOM 渲染副作用。
此钩子不会在服务端渲染期间调用。
mounted
在组件挂载完成后调用。
类型
tsinterface ComponentOptions { mounted?(this: ComponentPublicInstance): void }详情
组件在以下情况之后被视为已挂载:
其所有同步子组件都已挂载(不包括异步组件或
<Suspense>树中的组件)。它自身的 DOM 树已经创建并插入到父容器中。请注意,只有当应用的根容器也在文档中时,才能保证组件的 DOM 树在文档中。
此钩子通常用于执行需要访问组件渲染后 DOM 的副作用,或者在 服务端渲染应用 中将与 DOM 相关的代码限制在客户端执行。
此钩子不会在服务端渲染期间调用。
beforeUpdate
在组件由于响应式状态变化而即将更新其 DOM 树之前调用。
类型
tsinterface ComponentOptions { beforeUpdate?(this: ComponentPublicInstance): void }详情
此钩子可用于在 Vue 更新 DOM 之前访问 DOM 状态。在此钩子中修改组件状态也是安全的。
此钩子不会在服务端渲染期间调用。
updated
在组件由于响应式状态变化而更新其 DOM 树后调用。
类型
tsinterface ComponentOptions { updated?(this: ComponentPublicInstance): void }详情
父组件的 updated 钩子会在其子组件的 updated 钩子之后调用。
此钩子会在组件的任何 DOM 更新之后调用,而这些更新可能由不同的状态变化引起。如果你需要在某次特定状态变化后访问更新后的 DOM,请改用 nextTick()。
此钩子不会在服务端渲染期间调用。
WARNING
不要在 updated 钩子中修改组件状态——这很可能会导致无限更新循环!
beforeUnmount
在组件实例即将卸载之前调用。
类型
tsinterface ComponentOptions { beforeUnmount?(this: ComponentPublicInstance): void }详情
调用此钩子时,组件实例仍然完全可用。
此钩子不会在服务端渲染期间调用。
unmounted
在组件卸载完成后调用。
类型
tsinterface ComponentOptions { unmounted?(this: ComponentPublicInstance): void }详情
组件在以下情况之后被视为已卸载:
其所有子组件都已卸载。
其所有相关的响应式副作用(渲染副作用以及在
setup()期间创建的 computed / watchers)都已停止。
使用此钩子清理手动创建的副作用,例如定时器、DOM 事件监听器或服务器连接。
此钩子不会在服务端渲染期间调用。
errorCaptured
当捕获到从后代组件传播上来的错误时调用。
类型
tsinterface ComponentOptions { errorCaptured?( this: ComponentPublicInstance, err: unknown, instance: ComponentPublicInstance | null, info: string ): boolean | void }详情
可从以下来源捕获错误:
- 组件渲染
- 事件处理器
- 生命周期钩子
setup()函数- 侦听器
- 自定义指令钩子
- 过渡钩子
该钩子接收三个参数:错误、触发该错误的组件实例,以及用于指定错误来源类型的信息字符串。
TIP
在生产环境中,第 3 个参数(
info)将是缩短后的代码,而不是完整的信息字符串。你可以在 生产环境错误代码参考 中找到代码到字符串的映射。你可以在
errorCaptured()中修改组件状态,向用户显示错误状态。不过,重要的是错误状态不应渲染导致错误的原始内容;否则组件将陷入无限渲染循环。该钩子可以返回
false来阻止错误继续向上传播。详见下方错误传播规则。错误传播规则
默认情况下,所有错误仍会发送到应用级别的
app.config.errorHandler(如果已定义),以便这些错误仍可在一个地方报告给分析服务。如果组件继承链或父链上存在多个
errorCaptured钩子,它们都会按自下而上的顺序针对同一个错误被调用。这类似于原生 DOM 事件的冒泡机制。如果
errorCaptured钩子自身抛出错误,则该错误和最初捕获到的错误都会发送到app.config.errorHandler。errorCaptured钩子可以返回false,以阻止错误继续传播。本质上,这相当于表示“这个错误已经被处理,应被忽略”。这将阻止该错误触发任何额外的errorCaptured钩子或app.config.errorHandler。
错误捕获注意事项
在具有异步
setup()函数(使用顶层await)的组件中,即使setup()抛出了错误,Vue 始终 会尝试渲染组件模板。这很可能会导致更多错误,因为在渲染过程中组件模板可能会尝试访问失败的setup()上下文中不存在的属性。在捕获此类组件中的错误时,要准备同时处理异步setup()失败(它们总是会先发生)和渲染过程失败这两类错误。在
<Suspense>内部深层的父组件中替换出错的子组件,会导致 SSR 中的 hydration 不匹配。作为替代,尝试将可能会抛出错误的逻辑从子组件的setup()中拆分到单独的函数里,并在父组件的setup()中执行它,在那里你可以安全地使用try/catch处理执行过程,并在实际渲染子组件之前根据需要进行替换。
renderTracked
当某个响应式依赖被组件的渲染副作用追踪时调用。
此钩子仅在开发模式下调用,并且不会在服务端渲染期间调用。
类型
tsinterface ComponentOptions { renderTracked?(this: ComponentPublicInstance, e: DebuggerEvent): void } type DebuggerEvent = { effect: ReactiveEffect target: object type: TrackOpTypes /* 'get' | 'has' | 'iterate' */ key: any }另请参阅 响应式深度解析
renderTriggered
当某个响应式依赖触发组件的渲染副作用重新运行时调用。
此钩子仅在开发模式下调用,并且不会在服务端渲染期间调用。
类型
tsinterface ComponentOptions { renderTriggered?(this: ComponentPublicInstance, e: DebuggerEvent): void } type DebuggerEvent = { effect: ReactiveEffect target: object type: TriggerOpTypes /* 'set' | 'add' | 'delete' | 'clear' */ key: any newValue?: any oldValue?: any oldTarget?: Map<any, any> | Set<any> }另请参阅 响应式深度解析
activated
在组件实例作为由 <KeepAlive> 缓存的树的一部分插入到 DOM 后调用。
此钩子不会在服务端渲染期间调用。
类型
tsinterface ComponentOptions { activated?(this: ComponentPublicInstance): void }另请参阅 指南 - 缓存实例的生命周期
deactivated
在组件实例作为由 <KeepAlive> 缓存的树的一部分从 DOM 中移除后调用。
此钩子不会在服务端渲染期间调用。
类型
tsinterface ComponentOptions { deactivated?(this: ComponentPublicInstance): void }另请参阅 指南 - 缓存实例的生命周期
serverPrefetch
在组件实例即将于服务器上渲染之前要解析的异步函数。
类型
tsinterface ComponentOptions { serverPrefetch?(this: ComponentPublicInstance): Promise<any> }详情
如果该钩子返回一个 Promise,服务器渲染器会等待该 Promise 解析后再渲染组件。
这个钩子只会在服务端渲染期间被调用,可用于执行仅限服务器端的数据获取。
示例
jsexport default { data() { return { data: null } }, async serverPrefetch() { // 组件会作为初始请求的一部分被渲染 // 在服务器上预先获取数据,因为它比在客户端更快 this.data = await fetchOnServer(/* ... */) }, async mounted() { if (!this.data) { // 如果在挂载时 data 为 null,说明该组件 // 是在客户端动态渲染的。改为执行 // 客户端数据获取。 this.data = await fetchOnClient(/* ... */) } } }另请参见 服务器端渲染