]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
chore: Merge branch 'minor' into edison/feat/vaporKeepAlive edison/feat/vaporKeepAlive 13186/head
authordaiwei <daiwei521@126.com>
Wed, 16 Jul 2025 13:28:41 +0000 (21:28 +0800)
committerdaiwei <daiwei521@126.com>
Wed, 16 Jul 2025 13:28:41 +0000 (21:28 +0800)
1  2 
packages/runtime-core/src/apiCreateApp.ts
packages/runtime-core/src/component.ts
packages/runtime-core/src/components/KeepAlive.ts
packages/runtime-core/src/index.ts
packages/runtime-core/src/renderer.ts
packages/runtime-vapor/src/apiTemplateRef.ts
packages/runtime-vapor/src/block.ts
packages/runtime-vapor/src/component.ts
packages/runtime-vapor/src/index.ts
packages/runtime-vapor/src/vdomInterop.ts

index 731da28b8f526708b4bd4ed1114ac0d96745bae0,f4244f360e34a6e669d1d50120e07eb1f6a7355e..5cad49b96786a4ca53845e562748a7447408d598
@@@ -449,91 -503,3 +453,99 @@@ export function resetShapeFlag(vnode: a
  function getInnerChild(vnode: VNode) {
    return vnode.shapeFlag & ShapeFlags.SUSPENSE ? vnode.ssContent! : vnode
  }
-   queuePostRenderEffect(() => {
-     instance.isDeactivated = false
-     if (instance.a) {
-       invokeArrayFns(instance.a)
-     }
-     const vnodeHook = vnode.props && vnode.props.onVnodeMounted
-     if (vnodeHook) {
-       invokeVNodeHook(vnodeHook, instance.parent, vnode)
-     }
-   }, parentSuspense)
 +
 +/**
 + * shared between runtime-core and runtime-vapor
 + */
 +export function activate(
 +  vnode: VNode,
 +  container: RendererElement,
 +  anchor: RendererNode | null,
 +  { p: patch, m: move }: RendererInternals,
 +  parentComponent: ComponentInternalInstance | null,
 +  parentSuspense: SuspenseBoundary | null,
 +  namespace?: ElementNamespace,
 +  optimized?: boolean,
 +): void {
 +  const instance = vnode.component!
 +  move(
 +    vnode,
 +    container,
 +    anchor,
 +    MoveType.ENTER,
 +    parentComponent,
 +    parentSuspense,
 +  )
 +  // in case props have changed
 +  patch(
 +    instance.vnode,
 +    vnode,
 +    container,
 +    anchor,
 +    instance,
 +    parentSuspense,
 +    namespace,
 +    vnode.slotScopeIds,
 +    optimized,
 +  )
-   queuePostRenderEffect(() => {
-     if (instance.da) {
-       invokeArrayFns(instance.da)
-     }
-     const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted
-     if (vnodeHook) {
-       invokeVNodeHook(vnodeHook, instance.parent, vnode)
-     }
-     instance.isDeactivated = true
-   }, parentSuspense)
++  queuePostRenderEffect(
++    () => {
++      instance.isDeactivated = false
++      if (instance.a) {
++        invokeArrayFns(instance.a)
++      }
++      const vnodeHook = vnode.props && vnode.props.onVnodeMounted
++      if (vnodeHook) {
++        invokeVNodeHook(vnodeHook, instance.parent, vnode)
++      }
++    },
++    undefined,
++    parentSuspense,
++  )
 +
 +  if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
 +    // Update components tree
 +    devtoolsComponentAdded(instance)
 +  }
 +}
 +
 +/**
 + * shared between runtime-core and runtime-vapor
 + */
 +export function deactivate(
 +  vnode: VNode,
 +  container: RendererElement,
 +  { m: move }: RendererInternals,
 +  parentComponent: ComponentInternalInstance | null,
 +  parentSuspense: SuspenseBoundary | null,
 +): void {
 +  const instance = vnode.component!
 +  invalidateMount(instance.m)
 +  invalidateMount(instance.a)
 +
 +  move(vnode, container, null, MoveType.LEAVE, parentComponent, parentSuspense)
++  queuePostRenderEffect(
++    () => {
++      if (instance.da) {
++        invokeArrayFns(instance.da)
++      }
++      const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted
++      if (vnodeHook) {
++        invokeVNodeHook(vnodeHook, instance.parent, vnode)
++      }
++      instance.isDeactivated = true
++    },
++    undefined,
++    parentSuspense,
++  )
 +
 +  if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
 +    // Update components tree
 +    devtoolsComponentAdded(instance)
 +  }
 +
 +  // for e2e test
 +  if (__DEV__ && __BROWSER__) {
 +    ;(instance as any).__keepAliveStorageContainer = container
 +  }
 +}
Simple merge
Simple merge
index 9693bb1adc9602dd0b8f8063642efc22b872b4cd,e021ce84b051432f5bda391d9459f04453ac9a13..1cfda886c393d8c4693624837b688c088d52b93f
@@@ -7,10 -6,8 +7,10 @@@ import 
    unmountComponent,
  } from './component'
  import { createComment, createTextNode } from './dom/node'
- import { EffectScope, pauseTracking, resetTracking } from '@vue/reactivity'
+ import { EffectScope, setActiveSub } from '@vue/reactivity'
  import { isHydrating } from './dom/hydration'
 +import { isKeepAlive } from 'vue'
 +import type { KeepAliveInstance } from './components/KeepAlive'
  
  export type Block =
    | Node
@@@ -50,17 -47,12 +50,17 @@@ export class DynamicFragment extends Va
      }
      this.current = key
  
-     pauseTracking()
+     const prevSub = setActiveSub()
      const parent = this.anchor.parentNode
  
 +    const instance = currentInstance!
      // teardown previous branch
      if (this.scope) {
 -      this.scope.stop()
 +      if (isKeepAlive(instance)) {
 +        ;(instance as KeepAliveInstance).process(this.nodes)
 +      } else {
 +        this.scope.stop()
 +      }
        parent && remove(this.nodes, parent)
      }
  
index 3f1e8e1acbb2a38d0971c36c6b4b44add9360eec,da57882c49de648cd4abdda7c133af7cc390b262..ec503d2e664cde8631db64685ae6665bf14aa2a5
@@@ -31,18 -30,11 +31,17 @@@ import 
    type ShallowRef,
    markRaw,
    onScopeDispose,
-   pauseTracking,
    proxyRefs,
-   resetTracking,
+   setActiveSub,
    unref,
  } from '@vue/reactivity'
 -import { EMPTY_OBJ, invokeArrayFns, isFunction, isString } from '@vue/shared'
 +import {
 +  EMPTY_OBJ,
 +  ShapeFlags,
 +  invokeArrayFns,
 +  isFunction,
 +  isString,
 +} from '@vue/shared'
  import {
    type DynamicPropsSource,
    type RawProps,
Simple merge
index cb52d304842add995c118f8dc0db92b88108ead5,1573a306922aacd6813fc8cdfe8f7c7a84ec4f4a..446eb6a8ad69c4dff26cd5f4a52d978d3cf8bda1
@@@ -14,13 -14,11 +14,14 @@@ import 
    currentInstance,
    ensureRenderer,
    isEmitListener,
 +  isKeepAlive,
    onScopeDispose,
    renderSlot,
+   shallowReactive,
    shallowRef,
    simpleSetCurrentInstance,
 +  activate as vdomActivate,
 +  deactivate as vdomDeactivate,
  } from '@vue/runtime-dom'
  import {
    type LooseRawProps,
@@@ -44,13 -36,9 +45,15 @@@ import type { RawSlots, VaporSlot } fro
  import { renderEffect } from './renderEffect'
  import { createTextNode } from './dom/node'
  import { optimizePropertyLookup } from './dom/prop'
 +import {
 +  type KeepAliveInstance,
 +  activate,
 +  deactivate,
 +} from './components/KeepAlive'
 +import type { KeepAliveContext } from 'packages/runtime-core/src/components/KeepAlive'
  
+ export const interopKey: unique symbol = Symbol(`interop`)
  // mounting vapor components and slots in vdom
  const vaporInteropImpl: Omit<
    VaporInteropInterface,
      const prev = currentInstance
      simpleSetCurrentInstance(parentComponent)
  
 -    const propsRef = shallowRef(vnode.props)
 +    // filter out reserved props
 +    const props: VNode['props'] = {}
 +    for (const key in vnode.props) {
 +      if (!isReservedProp(key)) {
 +        props[key] = vnode.props[key]
 +      }
 +    }
 +
 +    const propsRef = shallowRef(props)
      const slotsRef = shallowRef(vnode.children)
  
+     const dynamicPropSource: (() => any)[] & { [interopKey]?: boolean } = [
+       () => propsRef.value,
+     ]
+     // mark as interop props
+     dynamicPropSource[interopKey] = true
      // @ts-expect-error
      const instance = (vnode.component = createComponent(
        vnode.type as any as VaporComponent,