| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- import { type Block, type BlockFn, insert } from './block'
- import { advanceHydrationNode, isHydrating } from './dom/hydration'
- import { DynamicFragment } from './fragment'
- import {
- insertionAnchor,
- insertionParent,
- isLastInsertion,
- resetInsertionState,
- } from './insertionState'
- import { renderEffect } from './renderEffect'
- /**
- * Create a dynamic fragment keyed by a reactive value for Vapor transitions.
- * The fragment is re-rendered when the key changes to trigger enter/leave
- * animations.
- *
- * Example:
- * <VaporTransition>
- * <h1 :key="count">{{ count }}</h1>
- * </VaporTransition>
- */
- export function createKeyedFragment(key: () => any, render: BlockFn): Block {
- const _insertionParent = insertionParent
- const _insertionAnchor = insertionAnchor
- const _isLastInsertion = isLastInsertion
- if (!isHydrating) resetInsertionState()
- const frag = __DEV__
- ? new DynamicFragment('keyed', true)
- : new DynamicFragment(undefined, true)
- renderEffect(() => frag.update(render, key()))
- if (!isHydrating) {
- if (_insertionParent) insert(frag, _insertionParent, _insertionAnchor)
- } else {
- if (_isLastInsertion) {
- advanceHydrationNode(_insertionParent!)
- }
- }
- return frag
- }
|