|
@@ -101,7 +101,10 @@ import {
|
|
|
renderSlotFallback,
|
|
renderSlotFallback,
|
|
|
} from './fragment'
|
|
} from './fragment'
|
|
|
import type { NodeRef } from './apiTemplateRef'
|
|
import type { NodeRef } from './apiTemplateRef'
|
|
|
-import { setTransitionHooks as setVaporTransitionHooks } from './components/Transition'
|
|
|
|
|
|
|
+import {
|
|
|
|
|
+ getVNodeKey,
|
|
|
|
|
+ setTransitionHooks as setVaporTransitionHooks,
|
|
|
|
|
+} from './components/Transition'
|
|
|
import { setInteropEnabled } from './vdomInteropState'
|
|
import { setInteropEnabled } from './vdomInteropState'
|
|
|
import {
|
|
import {
|
|
|
type KeepAliveInstance,
|
|
type KeepAliveInstance,
|
|
@@ -559,19 +562,22 @@ function resolveVNodeNodes(vnode: VNode): Block {
|
|
|
return vnode.el as Block
|
|
return vnode.el as Block
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function appendVnodeUpdatedHook(vnode: VNode, hook: () => void): void {
|
|
|
|
|
+ const props = (vnode.props ||= {})
|
|
|
|
|
+ const existing = props.onVnodeUpdated
|
|
|
|
|
+ props.onVnodeUpdated = existing
|
|
|
|
|
+ ? isArray(existing)
|
|
|
|
|
+ ? [...existing, hook]
|
|
|
|
|
+ : [existing, hook]
|
|
|
|
|
+ : hook
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function trackFragmentVNodeUpdates(frag: VaporFragment, vnode: VNode): void {
|
|
function trackFragmentVNodeUpdates(frag: VaporFragment, vnode: VNode): void {
|
|
|
const refresh = () => {
|
|
const refresh = () => {
|
|
|
frag.nodes = resolveVNodeNodes(vnode)
|
|
frag.nodes = resolveVNodeNodes(vnode)
|
|
|
if (frag.onUpdated) frag.onUpdated.forEach(m => m())
|
|
if (frag.onUpdated) frag.onUpdated.forEach(m => m())
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- const props = (vnode.props ||= {})
|
|
|
|
|
- const existing = props.onVnodeUpdated
|
|
|
|
|
- props.onVnodeUpdated = existing
|
|
|
|
|
- ? isArray(existing)
|
|
|
|
|
- ? [...existing, refresh]
|
|
|
|
|
- : [existing, refresh]
|
|
|
|
|
- : refresh
|
|
|
|
|
|
|
+ appendVnodeUpdatedHook(vnode, refresh)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -903,12 +909,21 @@ function ensureRendererBridge(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function trackSlotVNodeUpdates(frag: VaporFragment, vnode: VNode): void {
|
|
function trackSlotVNodeUpdates(frag: VaporFragment, vnode: VNode): void {
|
|
|
- trackFragmentVNodeUpdates(frag, vnode)
|
|
|
|
|
- if (vnode.type === Fragment && isArray(vnode.children)) {
|
|
|
|
|
- vnode.children.forEach(child => {
|
|
|
|
|
- if (isVNode(child)) trackSlotVNodeUpdates(frag, child)
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ const refresh = () => {
|
|
|
|
|
+ frag.nodes = resolveVNodeNodes(vnode)
|
|
|
|
|
+ if (frag.onUpdated) frag.onUpdated.forEach(m => m())
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ const track = (node: VNode) => {
|
|
|
|
|
+ appendVnodeUpdatedHook(node, refresh)
|
|
|
|
|
+ if (node.type === Fragment && isArray(node.children)) {
|
|
|
|
|
+ node.children.forEach(child => {
|
|
|
|
|
+ if (isVNode(child)) track(child)
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ track(vnode)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1021,6 +1036,8 @@ function renderVDOMSlot(
|
|
|
|
|
|
|
|
if (isHydrating) {
|
|
if (isHydrating) {
|
|
|
if (isVNode(resolved)) {
|
|
if (isVNode(resolved)) {
|
|
|
|
|
+ frag.vnode = resolved
|
|
|
|
|
+ frag.$key = getVNodeKey(resolved)
|
|
|
trackSlotVNodeUpdates(frag, resolved)
|
|
trackSlotVNodeUpdates(frag, resolved)
|
|
|
hydrateVNode(resolved, parentComponent as any)
|
|
hydrateVNode(resolved, parentComponent as any)
|
|
|
currentVNode = resolved
|
|
currentVNode = resolved
|
|
@@ -1039,6 +1056,8 @@ function renderVDOMSlot(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (isVNode(resolved)) {
|
|
if (isVNode(resolved)) {
|
|
|
|
|
+ frag.vnode = resolved
|
|
|
|
|
+ frag.$key = getVNodeKey(resolved)
|
|
|
trackSlotVNodeUpdates(frag, resolved)
|
|
trackSlotVNodeUpdates(frag, resolved)
|
|
|
if (currentBlock) {
|
|
if (currentBlock) {
|
|
|
remove(currentBlock, parentNode)
|
|
remove(currentBlock, parentNode)
|
|
@@ -1060,6 +1079,8 @@ function renderVDOMSlot(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (resolved) {
|
|
if (resolved) {
|
|
|
|
|
+ frag.vnode = null
|
|
|
|
|
+ frag.$key = undefined
|
|
|
if (currentVNode) {
|
|
if (currentVNode) {
|
|
|
internals.um(currentVNode, parentComponent as any, null, true)
|
|
internals.um(currentVNode, parentComponent as any, null, true)
|
|
|
currentVNode = null
|
|
currentVNode = null
|
|
@@ -1083,6 +1104,8 @@ function renderVDOMSlot(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// mark as empty
|
|
// mark as empty
|
|
|
|
|
+ frag.vnode = null
|
|
|
|
|
+ frag.$key = undefined
|
|
|
frag.nodes = []
|
|
frag.nodes = []
|
|
|
} finally {
|
|
} finally {
|
|
|
setCurrentSlotOwner(prevSlotOwner)
|
|
setCurrentSlotOwner(prevSlotOwner)
|