生命周期、模板 ref 与 nextTick 怎么配合?

先理解原理和示例,再练习完整口述与追问。

在正确阶段访问 DOM / 实例,条件渲染或列表变化后等待相关更新。模板 ref 可能为空,异步组件尚未就绪时也不能假定存在。组件停止使用时清理定时器、监听和外部实例。

setup 阶段准备响应式状态和钩子,但真实挂载元素尚不存在;onMounted 适合使用模板 ref 初始化客户端实例。状态变更后的 nextTick 等待框架本轮 DOM 更新,onUnmounted 清理副作用。v-if、异步组件与 Suspense 会让某些 ref 的就绪时间晚于父组件的普通初始化,因此应按子能力的真实就绪协议处理。

显示编辑器时先把 visible 改为 true,再 await nextTick,检查 editorRef.value 后聚焦;第三方编辑器异步初始化完成可以发 ready 事件。组件卸载时销毁编辑器、移除监听并停止请求。被 KeepAlive 包裹时,还需区分失活与卸载,暂停频繁轮询不应只放 onUnmounted。

onMounted 不是“所有资源都加载完”,nextTick 不是“网络完成”。SSR 下客户端钩子不执行,因此服务端首屏必需数据不能只依赖 mounted 请求。

我会在挂载后访问已存在的模板 ref,在条件分支出现或状态更新后用 nextTick 等待相关 DOM 更新。ref 在尚未挂载、条件关闭或组件卸载后可能为空,异步组件还要等待其自身就绪。监听、定时器和外部实例需要在卸载或不再使用时释放,SSR 阶段不做真实 DOM 操作。

面试官可能继续问追问与完整解答展开收起

onMounted 等 API 为什么通常要在 setup 同步阶段注册?nextTick 与浏览器 requestAnimationFrame 的等待目标有何不同?

生命周期注册依赖当前正在初始化的组件上下文,所以通常要在 setup 同步阶段完成;等到任意异步回调再注册可能找不到归属。nextTick 等 Vue 的更新队列,requestAnimationFrame 调度到浏览器下一次绘制前的回调阶段,两者不能替代图片加载或任意网络就绪。