]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: handle props update
authordaiwei <daiwei521@126.com>
Thu, 13 Mar 2025 03:09:21 +0000 (11:09 +0800)
committerdaiwei <daiwei521@126.com>
Thu, 13 Mar 2025 03:09:21 +0000 (11:09 +0800)
packages/runtime-vapor/src/apiCreateFor.ts
packages/runtime-vapor/src/block.ts
packages/runtime-vapor/src/components/Transition.ts

index f6b5d2bf8026ddbea5e18ec93e141496d6846916..a49c635e2ec9f2dd7607550cc8f5a574d26946f2 100644 (file)
@@ -22,7 +22,7 @@ import { currentInstance, isVaporComponent } from './component'
 import type { DynamicSlot } from './componentSlots'
 import { renderEffect } from './renderEffect'
 import { VaporVForFlags } from '../../shared/src/vaporFlags'
-import { applyTransitionEnterHooks } from './components/Transition'
+import { applyTransitionHooks } from './components/Transition'
 
 class ForBlock extends VaporFragment {
   scope: EffectScope | undefined
@@ -318,7 +318,7 @@ export const createFor = (
 
     // apply transition for new nodes
     if (frag.$transition) {
-      applyTransitionEnterHooks(block.nodes, frag.$transition)
+      applyTransitionHooks(block.nodes, frag.$transition)
     }
 
     if (parent) insert(block.nodes, parent, anchor)
index cfe9d5abf52a0bc78f797e804fbc3848a3fa2675..edd9bade6100361497eda371b9e0447848a72236 100644 (file)
@@ -16,7 +16,7 @@ import {
   performTransitionLeave,
 } from '@vue/runtime-dom'
 import {
-  applyTransitionEnterHooks,
+  applyTransitionHooks,
   applyTransitionLeaveHooks,
 } from './components/Transition'
 
@@ -85,7 +85,7 @@ export class DynamicFragment extends VaporFragment {
         this.scope = new EffectScope()
         this.nodes = this.scope.run(render) || []
         if (transition) {
-          this.$transition = applyTransitionEnterHooks(this.nodes, transition)
+          this.$transition = applyTransitionHooks(this.nodes, transition)
         }
         if (parent) insert(this.nodes, parent, this.anchor)
       } else {
index f5f0a98785b087b9e5fa150f7e77659f6567e884..e2a467d8a575fcd4e1c988e185998001afe57487 100644 (file)
@@ -43,16 +43,23 @@ export const VaporTransition: FunctionalComponent<TransitionProps> =
     let resolvedProps
     renderEffect(() => {
       resolvedProps = resolveTransitionProps(props)
+      // only update props for Fragment block, for later reusing
       if (isFragment(children) && children.$transition) {
         children.$transition.props = resolvedProps
+      } else {
+        // replace existing transition hooks
+        const child = findTransitionBlock(children)
+        if (child && child.$transition) {
+          child.$transition.props = resolvedProps
+          applyTransitionHooks(child, child.$transition)
+        }
       }
     })
 
-    const hooks = {
+    applyTransitionHooks(children, {
       state: useTransitionState(),
       props: resolvedProps!,
-    } as VaporTransitionHooks
-    applyTransitionEnterHooks(children, hooks)
+    } as VaporTransitionHooks)
 
     return children
   })
@@ -122,7 +129,7 @@ export function resolveTransitionHooks(
   return hooks
 }
 
-export function applyTransitionEnterHooks(
+export function applyTransitionHooks(
   block: Block,
   hooks: VaporTransitionHooks,
 ): VaporTransitionHooks {
@@ -130,20 +137,20 @@ export function applyTransitionEnterHooks(
   if (!child) return hooks
 
   const { props, state, delayedLeave } = hooks
-  let enterHooks = resolveTransitionHooks(
+  let resolvedHooks = resolveTransitionHooks(
     child,
     props,
     state,
     currentInstance!,
-    hooks => (enterHooks = hooks as VaporTransitionHooks),
+    hooks => (resolvedHooks = hooks as VaporTransitionHooks),
   )
-  enterHooks.delayedLeave = delayedLeave
-  setTransitionHooks(child, enterHooks)
+  resolvedHooks.delayedLeave = delayedLeave
+  setTransitionHooks(child, resolvedHooks)
   if (isFragment(block)) {
     // also set transition hooks on fragment for reusing during it's updating
-    setTransitionHooksToFragment(block, enterHooks)
+    setTransitionHooksToFragment(block, resolvedHooks)
   }
-  return enterHooks
+  return resolvedHooks
 }
 
 export function applyTransitionLeaveHooks(