]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: vdom interop
authordaiwei <daiwei521@126.com>
Wed, 5 Mar 2025 14:35:14 +0000 (22:35 +0800)
committerdaiwei <daiwei521@126.com>
Thu, 6 Mar 2025 03:11:52 +0000 (11:11 +0800)
packages/runtime-vapor/src/apiCreateDynamicComponent.ts
packages/runtime-vapor/src/block.ts
packages/runtime-vapor/src/component.ts
packages/runtime-vapor/src/components/Transition.ts
packages/runtime-vapor/src/vdomInterop.ts

index 2126611d7182e1cb548d4179e09dd536c8f3c920..c061c8224cdf27e8c610882d4243956d2af36f7b 100644 (file)
@@ -1,6 +1,6 @@
-import { resolveDynamicComponent } from '@vue/runtime-dom'
+import { currentInstance, resolveDynamicComponent } from '@vue/runtime-dom'
 import { DynamicFragment, type VaporFragment } from './block'
-import { createComponentWithFallback } from './component'
+import { createComponentWithFallback, emptyContext } from './component'
 import { renderEffect } from './renderEffect'
 import type { RawProps } from './componentProps'
 import type { RawSlots } from './componentSlots'
@@ -16,6 +16,8 @@ export function createDynamicComponent(
     : new DynamicFragment()
   renderEffect(() => {
     const value = getter()
+    const appContext =
+      (currentInstance && currentInstance.appContext) || emptyContext
     frag.update(
       () =>
         createComponentWithFallback(
@@ -23,6 +25,7 @@ export function createDynamicComponent(
           rawProps,
           rawSlots,
           isSingleRoot,
+          appContext,
         ),
       value,
     )
index 73b3af38f43e08890feb4ac780cebd414059b795..18313d191df02bfa5adfeb5d031d00a44c8e84ef 100644 (file)
@@ -43,8 +43,12 @@ export class VaporFragment implements TransitionOptions {
   $transition?: VaporTransitionHooks | undefined
   nodes: Block
   anchor?: Node
-  insert?: (parent: ParentNode, anchor: Node | null) => void
-  remove?: (parent?: ParentNode) => void
+  insert?: (
+    parent: ParentNode,
+    anchor: Node | null,
+    transitionHooks?: TransitionHooks,
+  ) => void
+  remove?: (parent?: ParentNode, transitionHooks?: TransitionHooks) => void
 
   constructor(nodes: Block) {
     this.nodes = nodes
@@ -170,7 +174,7 @@ export function insert(
   } else {
     // fragment
     if (block.insert) {
-      block.insert(parent, anchor)
+      block.insert(parent, anchor, (block as TransitionBlock).$transition)
     } else {
       insert(block.nodes, parent, anchor, parentSuspense)
     }
@@ -203,7 +207,7 @@ export function remove(block: Block, parent?: ParentNode): void {
   } else {
     // fragment
     if (block.remove) {
-      block.remove(parent)
+      block.remove(parent, (block as TransitionBlock).$transition)
     } else {
       remove(block.nodes, parent)
     }
index bd033d665388c66490771dd3be4e22fc77354ca3..b12ae3f2d47a9a717af84ad74327b69433bc6fd9 100644 (file)
@@ -278,7 +278,7 @@ export function devRender(instance: VaporComponentInstance): void {
     ) || []
 }
 
-const emptyContext: GenericAppContext = {
+export const emptyContext: GenericAppContext = {
   app: null as any,
   config: {},
   provides: /*@__PURE__*/ Object.create(null),
@@ -446,9 +446,10 @@ export function createComponentWithFallback(
   rawProps?: LooseRawProps | null,
   rawSlots?: LooseRawSlots | null,
   isSingleRoot?: boolean,
+  appContext?: GenericAppContext,
 ): HTMLElement | VaporComponentInstance {
   if (!isString(comp)) {
-    return createComponent(comp, rawProps, rawSlots, isSingleRoot)
+    return createComponent(comp, rawProps, rawSlots, isSingleRoot, appContext)
   }
 
   const el = document.createElement(comp)
index 01326e5d98e1fe360f857d2e9e7a3ec0c4cb7e2b..13ec46ad6dcabb341ed42541c0ed6397c349ed79 100644 (file)
@@ -230,7 +230,11 @@ export function findTransitionBlock(block: Block): TransitionBlock | undefined {
       }
     }
   } else if (isFragment(block)) {
-    child = findTransitionBlock(block.nodes)
+    if (block.insert) {
+      child = block
+    } else {
+      child = findTransitionBlock(block.nodes)
+    }
   }
 
   if (__DEV__ && !child) {
index f6dbd267396e3f2f670f0310bc8bb0a716d41622..dc3ff7c5e6d6bfa69247d78fe67dfad40dcf99de 100644 (file)
@@ -7,6 +7,7 @@ import {
   type RendererInternals,
   type ShallowRef,
   type Slots,
+  type TransitionHooks,
   type VNode,
   type VaporInteropInterface,
   createVNode,
@@ -14,6 +15,7 @@ import {
   ensureRenderer,
   onScopeDispose,
   renderSlot,
+  setTransitionHooks,
   shallowRef,
   simpleSetCurrentInstance,
 } from '@vue/runtime-dom'
@@ -171,14 +173,16 @@ function createVDOMComponent(
 
   let isMounted = false
   const parentInstance = currentInstance as VaporComponentInstance
-  const unmount = (parentNode?: ParentNode) => {
+  const unmount = (parentNode?: ParentNode, transition?: TransitionHooks) => {
+    if (transition) setTransitionHooks(vnode, transition)
     internals.umt(vnode.component!, null, !!parentNode)
   }
 
-  frag.insert = (parentNode, anchor) => {
+  frag.insert = (parentNode, anchor, transition) => {
     const prev = currentInstance
     simpleSetCurrentInstance(parentInstance)
     if (!isMounted) {
+      if (transition) setTransitionHooks(vnode, transition)
       internals.mt(
         vnode,
         parentNode,