import { isViewModel, vm } from '../../vm'; import type { Context } from '../../core'; import { ComponentHost, renderSlotFunction } from '../../core'; import { type ForEach, KEY_DATA, type Key, type KeyFn } from './common'; import type { FC } from '../../jsx'; function appendRenderEach( vmMode: boolean, item: T, index: number, itemRenderFn: FC, roots: (ForEach | Node)[], key: Key | undefined, context?: Context, ) { // const el = newComponentWithDefaultSlot(context) as ForEach; const el = new ComponentHost(context) as ForEach; const each = vmMode ? vm({ data: item, index, key }) : { data: item, index, key }; el[KEY_DATA] = each; roots.push(el); return renderSlotFunction(el, itemRenderFn, each); } export function renderItems( items: T[], itemRenderFn: FC, roots: (ForEach | Node)[], keys: Map, number> | undefined, keyFn: KeyFn | undefined, context?: Context, ) { const result: Node[] = []; const vmMode = isViewModel(items); items.forEach((item, index) => { const key = keyFn?.(item, index); keyFn && keys!.set(key!, index); const els = appendRenderEach(vmMode, item, index, itemRenderFn, roots, key, context); result.push(...els); }); return result; }