import { DefineComponent, PropType } from 'vue'; import { JSX } from 'vue/jsx-runtime'; export interface BaseWaterfallItem { id?: string | number; height?: number; width?: number; getSize?: () => { width: number; height: number; }; } interface RowInfo { items: T[]; totalWidth: number; itemWidths: number[]; scales: number[]; rowHeight: number; } export interface ItemLayoutInfo { width: number; height: number; originalWidth: number; originalHeight: number; scale: number; displayWidth: number; displayHeight: number; } interface RowFlowParams { rowHeight: number; gap?: number; columnGap?: number; containerWidth?: number | string; bufferSize?: number; items: T[]; targetItemsPerRow?: number; plusItemHeight?: number; fillEmptySpace?: boolean; renderItem: (item: T, index: number, layout: ItemLayoutInfo) => JSX.Element | null; scrollPlaceholder?: boolean; scrollDebounceTime?: number; scrollSpeedThreshold?: number; renderSpace?: (item: T, index: number, layout: ItemLayoutInfo) => JSX.Element | null; preformanceConfig?: { afterRowDelayTime?: number; requestIdleCallback?: boolean; }; header?: { createJsx: () => JSX.Element; height: number; }; } interface NeighborItems { up: T | null; down: T | null; left: T | null; right: T | null; } export default class ZRowFlow { private rows; private visibleItemsRef; private isScrollingRef; private scrolling; private lastScrollTop; private lastScrollTime; private resizeObserver; private renderItem; private renderSpace; private state; private containerDimensions; private renderedItemsRef; private cachedRows; private _delayRenderTimer; private lastScrollDirection; private _destroyed; private _rafId; private _idleIds; private catchVisibleRows; constructor(params: RowFlowParams); private getItemSize; /** * 计算单个项目的初始宽度 */ private calculateInitialItemWidth; /** * 准备项目数据,计算宽高比 */ private prepareItemsWithRatio; /** * 创建占位项目(用于最后一行填充) */ private createPlaceholderItems; /** * 计算行的尺寸信息 */ private calculateRowDimensions; /** * 创建单行布局信息 */ private createRow; /** * 将项目分配到行中 */ private distributeItemsIntoRows; private initializeLayout; private updateVisibleRows; private requestIdleCallbackPolyfill; setRowToRender(key: string, row: RowInfo): void; setRowItemToRender(key: string, items: T[], index: number, onDone: () => void): void; private processDelayRenderQueue; private processAfterRowDelayTime; private handleScroll; private handleResize; setItems(items: T[]): void; setRowHeight(height: number): void; setGap(gap: number): void; setColumnGap(gap: number): void; setContainerHeight(height: number | string): void; setContainerWidth(width: number | string): void; setBufferSize(size: number): void; setTargetItemsPerRow(count: number): void; setPlusItemHeight(height: number): void; setFillEmptySpace(fill: boolean): void; updateConfig(config: Partial<{ rowHeight: number; gap: number; columnGap: number; containerHeight: number | string; containerWidth: number | string; bufferSize: number; plusItemHeight: number; scrollPlaceholder?: boolean; scrollDebounceTime?: number; }>): void; getConfig(): { rowHeight: number; gap: number; columnGap: number; containerHeight: string | number; containerWidth: string | number; bufferSize: number; contentHeight: number; itemsCount: number; rowsCount: number; visibleRowsCount: number; targetItemsPerRow: number; plusItemHeight: number; actualItemsPerRow: number; scrollPlaceholder: boolean; scrollDebounceTime: number; }; protected createJsx(): JSX.Element; createElement(): DefineComponent; private getRowTopOffset; /** * 查找项目在行和列中的位置 * @param itemId 要查找的项目ID * @returns 项目位置对象,如果未找到则返回null */ private findItemPosition; /** * 获取指定项目的上下左右相邻项目 * @param itemId 当前项目的ID * @returns 包含上下左右方向相邻项目的对象,如果某个方向没有相邻项目则对应值为null */ getItemNeighbors(itemId: string | number): NeighborItems; /** * 计算项目在行中的起始X坐标 * @param rowIndex 行索引 * @param colIndex 列索引 * @returns 项目的起始X坐标 */ private getItemStartX; /** * 获取指定位置的项目 * @param rowIndex 行索引 * @param colIndex 列索引 * @returns 指定位置的项目,如果位置无效则返回null */ getItemAtPosition(rowIndex: number, colIndex: number): T | null; /** * 获取第一个可见的项目 * @returns 第一个可见的项目,如果没有可见项目则返回null */ getFirstVisibleItem(): T | null; /** * 滚动到指定项目并使其尽量居中显示 * @param itemId 要滚动到的项目ID * @param behavior 滚动行为,默认为'smooth'平滑滚动 * @returns 是否成功滚动到目标项目 */ scrollToItem(itemId: string | number, behavior?: ScrollBehavior): boolean; /** * 获取当前项目的下一个项目 * @param itemId 当前项目的ID * @returns 下一个项目,如果是本行最后一个则返回下一行第一个,如果是最后一个项目则返回null */ getNext(itemId: string | number): T | null; /** * 获取当前项目的上一个项目 * @param itemId 当前项目的ID * @returns 上一个项目,如果是本行第一个则返回上一行最后一个,如果是第一个项目则返回null */ getPrevious(itemId: string | number): T | null; /** * 获取当前项目所在行的上一行第一个项目 * @param itemId 当前项目的ID * @returns 上一行的第一个项目,如果当前已是第一行则返回null */ getPreviousRowFirstItem(itemId: string | number): T | null; /** * 获取当前项目所在行的下一行第一个项目 * @param itemId 当前项目的ID * @returns 下一行的第一个项目,如果当前已是最后一行则返回null */ getNextRowFirstItem(itemId: string | number): T | null; /** * 获取两个节点之间的所有节点(包括这两个节点自身) * @param startItemId 起始节点ID * @param endItemId 结束节点ID * @returns 包含两个节点之间所有节点的数组(如果节点不存在则返回空数组) */ getItemsBetween(startItemId: string | number, endItemId: string | number): T[]; setHeaderHeight(height: number): void; /** * 重绘当前可视区域的节点 * 通过清除已渲染项的缓存,强制重新调用所有可视节点的createJsx * @returns 是否成功重绘 */ redrawVisibleItems(): boolean; destroy(): void; } export declare const ZRowFlowComponent: DefineComponent; required: true; }; renderItem: { type: PropType<(item: BaseWaterfallItem, index: number, layout: ItemLayoutInfo) => JSX.Element | null>; required: true; }; rowHeight: { type: NumberConstructor; required: true; }; gap: { type: NumberConstructor; default: number; }; columnGap: { type: NumberConstructor; default: number; }; containerWidth: { type: PropType; default: string; }; bufferSize: { type: NumberConstructor; default: number; }; targetItemsPerRow: { type: NumberConstructor; default: number; }; plusItemHeight: { type: NumberConstructor; default: number; }; fillEmptySpace: { type: BooleanConstructor; default: boolean; }; renderSpace: { type: any; default: null; }; scrollPlaceholder: { type: BooleanConstructor; default: boolean; }; scrollDebounceTime: { type: NumberConstructor; default: number; }; scrollSpeedThreshold: { type: NumberConstructor; default: number; }; preformanceConfig: { type: PropType<{ afterRowDelayTime?: number; requestIdleCallback?: boolean; }>; default: () => { afterRowDelayTime: number; requestIdleCallback: boolean; }; }; header: { type: PropType<{ createJsx: () => JSX.Element; height: number; } | null>; default: null; }; }>, () => JSX.Element, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("scroll" | "reachBottom" | "visibleChange")[], "scroll" | "reachBottom" | "visibleChange", import('vue').PublicProps, Readonly; required: true; }; renderItem: { type: PropType<(item: BaseWaterfallItem, index: number, layout: ItemLayoutInfo) => JSX.Element | null>; required: true; }; rowHeight: { type: NumberConstructor; required: true; }; gap: { type: NumberConstructor; default: number; }; columnGap: { type: NumberConstructor; default: number; }; containerWidth: { type: PropType; default: string; }; bufferSize: { type: NumberConstructor; default: number; }; targetItemsPerRow: { type: NumberConstructor; default: number; }; plusItemHeight: { type: NumberConstructor; default: number; }; fillEmptySpace: { type: BooleanConstructor; default: boolean; }; renderSpace: { type: any; default: null; }; scrollPlaceholder: { type: BooleanConstructor; default: boolean; }; scrollDebounceTime: { type: NumberConstructor; default: number; }; scrollSpeedThreshold: { type: NumberConstructor; default: number; }; preformanceConfig: { type: PropType<{ afterRowDelayTime?: number; requestIdleCallback?: boolean; }>; default: () => { afterRowDelayTime: number; requestIdleCallback: boolean; }; }; header: { type: PropType<{ createJsx: () => JSX.Element; height: number; } | null>; default: null; }; }>> & Readonly<{ onScroll?: ((...args: any[]) => any) | undefined; onReachBottom?: ((...args: any[]) => any) | undefined; onVisibleChange?: ((...args: any[]) => any) | undefined; }>, { header: { createJsx: () => JSX.Element; height: number; } | null; bufferSize: number; gap: number; containerWidth: string | number; columnGap: number; plusItemHeight: number; preformanceConfig: { afterRowDelayTime?: number; requestIdleCallback?: boolean; }; scrollPlaceholder: boolean; scrollDebounceTime: number; scrollSpeedThreshold: number; renderSpace: any; targetItemsPerRow: number; fillEmptySpace: boolean; }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; export {};