$ the-wire · showcase
Vue core tightens root-render flushing and async placeholder patching
By RepoJournal · Filed · About Vue.js · Composed from the cited sources · methodology
A day of runtime-core and compiler-sfc correctness fixes: root renders no longer drain queues they don't own, and async components keep their placeholder until they can actually be patched.
fix(runtime-core): only flush jobs queued by the root render itself vuejs/core
A root render() ended with flushPreFlushCbs() and flushPostFlushCbs(), which drained the entire queue, so createApp().mount() inside a pre watcher ran every other pending pre job nested in that callback and a plain mount() after a state change ran other apps' pending watchers synchronously. A root render now flushes only the jobs it queued, which changes timing for code that relied on the old b...
fix(runtime-core): keep async placeholder for block patching and pending component updates vuejs/core
patchBlockChildren picked the patch container from oldVNode.el, but a component whose async setup() has not resolved has only a placeholder comment, so the lookup fell back to the block root. When such a component sat in a nested element and its vnode was replaced, the new node was inserted with an anchor belonging to the nested element and the DOM threw NotFoundError in jsdom.
fix(compiler-sfc): error when defineModel prop options reference a destructured prop vuejs/core
defineModel() hoists its prop options into the component's props, but the props destructure transform still rewrote identifiers inside them: a default reading a destructured prop produced _useModel(__props, "modelValue"__props.defaultValue) and the file stopped parsing. Since the options land at module scope, where neither the destructured binding nor __props exists, the compiler now errors ins...
fix(custom-element): skip mounting an async custom element removed while its component loads (#15777) vuejs/core
An async custom element removed while its component was still loading previously went on to mount, and mounting now skips that element. Anyone embedding Vue components through defineCustomElement inside conditionally rendered markup gets the fix.
fix(transition-group): measure nested groups against their moving outer item vuejs/core
Nested transition groups now measure their movement against the enclosing group's moving outer item instead of computing positions in isolation, which stops the incorrect position shifts that appeared when parent and child groups updated independently. It closes a pair of transition-group issues that had stayed open.
fix(types): accept union-typed props in mount vuejs/test-utils
test-utils has carried a type regression since 2.4.2: P is inferred from props, but the only inference site is RawProps & P inside a union, so TypeScript picked the first union member and rejected shapes like { foo: string } | { foo: { bar: string } }. The types now accept union-typed props in mount. The oxfmt bump to v0.72.0 and pkg-pr-new to 0.0.91 are routine.