VNode 不存储 Transition 动画状态,该状态由 Transition 组件实例自身维护;VNode 仅携带 transition 配置引用、指令及组件类型标记等静态信息,不包含 isEntering 等运行时字段。

Vue.js 中的 VNode 并不直接存储 Transition 组件的动画状态。动画状态(如进入中、离开中、完成标志等)由 Transition 组件实例自身维护,VNode 仅作为渲染描述符,记录组件类型、props、children 等静态结构信息,不承载运行时状态。
Transition 的状态由组件实例管理
Transition 是一个内置的函数式组件(Vue 3 中为 setup 组件),它在挂载和更新过程中:
- 通过 ref 或 reactive 数据跟踪当前阶段(
isShowing、status、activeMode等) - 监听子元素的插入/移除,调用
beforeEnter/enter/afterEnter等钩子 - 使用
nextFrame、getComputedStyle等机制控制 CSS 动画节奏 - 内部维护一个
transitionState对象(非公开 API),例如:{ mode: 'out-in', isLeaving: false, hasMoved: true }
VNode 只保留过渡所需的最小上下文
Transition 渲染时生成的 VNode(即其子节点的 VNode)会携带少量与过渡相关的标记,但不是状态本身:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
vnode.transition:引用 Transition 实例的setup返回的过渡配置对象(含 enter/leave 钩子、CSS 类名等) -
vnode.dirs:若子元素用了v-show或自定义指令,可能包含过渡相关指令 -
vnode.shapeFlag & ShapeFlags.COMPONENT_TRANSITION:标识该 VNode 属于 Transition 子节点(Vue 3 内部用于优化) - 无
isEntering、elapsedTime等运行时字段 —— 这些只存在于 Transition 实例的响应式数据中
开发者无需操作 VNode 存储动画状态
如果你需要读写过渡状态(比如手动触发离开、等待动画结束),应通过以下方式:
立即学习“前端免费学习笔记(深入)”;
- 使用
ref获取 Transition 实例,访问其公开方法(如 Vue 3 中的toggle或内部_leaveCb) - 监听
@before-enter、@after-leave等事件,而非检查 VNode 字段 - 避免 patch 阶段修改 VNode 的
transition属性 —— 它是只读的渲染上下文引用 - 自定义过渡逻辑时,把状态存在
setup()的let isAnimating = ref(false)中,而非塞进 VNode
本质上,VNode 是纯描述性的轻量对象,而 Transition 的生命周期与状态管理交由组件实例完成。这种分离让渲染逻辑可预测,也避免了 VNode 膨胀和跨帧状态污染。

















