]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
chore: Merge branch 'edison/feat/setScopeId' into edison/testVapor
authordaiwei <daiwei521@126.com>
Fri, 20 Jun 2025 07:33:00 +0000 (15:33 +0800)
committerdaiwei <daiwei521@126.com>
Fri, 20 Jun 2025 07:44:02 +0000 (15:44 +0800)
1  2 
packages/compiler-vapor/src/generators/component.ts
packages/compiler-vapor/src/ir/index.ts
packages/compiler-vapor/src/transforms/transformElement.ts
packages/runtime-core/src/apiCreateApp.ts
packages/runtime-core/src/index.ts
packages/runtime-core/src/renderer.ts
packages/runtime-vapor/src/apiCreateDynamicComponent.ts
packages/runtime-vapor/src/block.ts
packages/runtime-vapor/src/component.ts
packages/runtime-vapor/src/componentSlots.ts
packages/runtime-vapor/src/vdomInterop.ts

index 7f5450d4ecb0c40ab7a63226aa4b95668a78158a,531496fb7433583694a7afceaa21e8320580df6e..4b6fbaded5a019e47b9a242eca08af887bb5d142
@@@ -186,13 -187,13 +186,18 @@@ export interface VaporInteropInterface 
    unmount(vnode: VNode, doRemove?: boolean): void
    move(vnode: VNode, container: any, anchor: any): void
    slot(n1: VNode | null, n2: VNode, container: any, anchor: any): void
 +  setTransitionHooks(
 +    component: ComponentInternalInstance,
 +    transition: TransitionHooks,
 +  ): void
 +  hydrate(node: Node, fn: () => void): void
  
-   vdomMount: (component: ConcreteComponent, props?: any, slots?: any) => any
+   vdomMount: (
+     component: ConcreteComponent,
+     props?: any,
+     slots?: any,
+     scopeId?: string,
+   ) => any
    vdomUnmount: UnmountComponentFn
    vdomSlot: (
      slots: any,
Simple merge
Simple merge
index 522fd43c232af58180563fcd685c388f24729b3d,ed9143e436e17c3765c5fb7ec7526e5afcba48e0..7942b76569e24092eb1cf37c00d520141e085b77
@@@ -42,7 -40,8 +44,9 @@@ export function createDynamicComponent
            rawProps,
            rawSlots,
            isSingleRoot,
+           once,
+           scopeId,
 +          appContext,
          ),
        value,
      )
index 1f38a3aad6087a8e82d4f0807976c15253fa8d12,6bbc08cc6e56589fe83557c2d7efc6520227db28..6a8dc3310dff0eabd2492a25d339912b2cd741f5
@@@ -8,46 -7,15 +7,46 @@@ import 
  } from './component'
  import { createComment, createTextNode } from './dom/node'
  import { EffectScope, pauseTracking, resetTracking } from '@vue/reactivity'
-   isHydrating,
 +import {
 +  currentHydrationNode,
 +  isComment,
- import { queuePostFlushCb } from '@vue/runtime-dom'
 +  locateHydrationNode,
 +  locateVaporFragmentAnchor,
 +} from './dom/hydration'
 +import {
 +  type TransitionHooks,
 +  type TransitionProps,
 +  type TransitionState,
 +  performTransitionEnter,
 +  performTransitionLeave,
 +} from '@vue/runtime-dom'
 +import {
 +  applyTransitionHooks,
 +  applyTransitionLeaveHooks,
 +} from './components/Transition'
 +
 +export interface TransitionOptions {
 +  $key?: any
 +  $transition?: VaporTransitionHooks
 +}
+ import { isHydrating } from './dom/hydration'
+ import { getInheritedScopeIds } from '@vue/runtime-dom'
  
 -export type Block =
 -  | Node
 -  | VaporFragment
 -  | DynamicFragment
 -  | VaporComponentInstance
 -  | Block[]
 +export interface VaporTransitionHooks extends TransitionHooks {
 +  state: TransitionState
 +  props: TransitionProps
 +  instance: VaporComponentInstance
 +  // mark transition hooks as disabled so that it skips during
 +  // inserting
 +  disabled?: boolean
 +}
 +
 +export type TransitionBlock =
 +  | (Node & TransitionOptions)
 +  | (VaporFragment & TransitionOptions)
 +  | (DynamicFragment & TransitionOptions)
 +
 +export type Block = TransitionBlock | VaporComponentInstance | Block[]
  
  export type BlockFn = (...args: any[]) => Block
  
@@@ -70,9 -32,15 +69,15 @@@ export class VaporFragment implements T
  }
  
  export class DynamicFragment extends VaporFragment {
 -  anchor: Node
 +  anchor!: Node
    scope: EffectScope | undefined
    current?: BlockFn
+   fallback?: BlockFn
+   /**
+    * slot only
+    * indicates forwarded slot
+    */
+   forwarded?: boolean
  
    constructor(anchorLabel?: string) {
      super([])
index beca2bceb0ed51c82eacfdc7d5b69969fb3d7126,6e59c0bdef5c4801fa6246a8cdeffe37a5070b20..6d63920a9f0ac2a7dcf46ec260dc858b10ed1e67
@@@ -165,10 -166,9 +167,11 @@@ export function createComponent
        component as any,
        rawProps,
        rawSlots,
+       scopeId,
      )
 -    if (!isHydrating && _insertionParent) {
 +
 +    // `frag.insert` handles both hydration and mounting
 +    if (_insertionParent) {
        insert(frag, _insertionParent, _insertionAnchor)
      }
      return frag
@@@ -489,10 -485,18 +493,20 @@@ export function createComponentWithFall
    rawProps?: LooseRawProps | null,
    rawSlots?: LooseRawSlots | null,
    isSingleRoot?: boolean,
+   once?: boolean,
+   scopeId?: string,
 +  appContext?: GenericAppContext,
  ): HTMLElement | VaporComponentInstance {
    if (!isString(comp)) {
-     return createComponent(comp, rawProps, rawSlots, isSingleRoot, appContext)
+     return createComponent(
+       comp,
+       rawProps,
+       rawSlots,
+       isSingleRoot,
+       once,
+       scopeId,
++      appContext,
+     )
    }
  
    const _insertionParent = insertionParent
index 2afe74f9c7ec324fbe24c48aec6d2c71f31c0786,020c729fa30b95a19175972744c7e54d0abd3c42..b3a931deee89ae4fe3ba3df7bc39ea3eaa909dfb
@@@ -197,12 -189,13 +198,18 @@@ export function createSlot
      }
    }
  
 -  if (!isHydrating && _insertionParent) {
+   if (i) fragment.forwarded = true
+   if (i || !hasForwardedSlot(fragment.nodes)) {
+     const scopeId = instance!.type.__scopeId
+     if (scopeId) setScopeId(fragment, `${scopeId}-s`)
+   }
 +  if (
 +    _insertionParent &&
 +    (!isHydrating ||
 +      // for vdom interop fragment, `fragment.insert` handles both hydration and mounting
 +      fragment.insert)
 +  ) {
      insert(fragment, _insertionParent, _insertionAnchor)
    }