@cleverbamboo/react-virtual-masonry 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +343 -0
- package/README.zh-CN.md +490 -0
- package/dist/DynamicMasonryView.d.ts +97 -0
- package/dist/DynamicMasonryView.d.ts.map +1 -0
- package/dist/FullWidthEqualHeightMasonry.d.ts +51 -0
- package/dist/FullWidthEqualHeightMasonry.d.ts.map +1 -0
- package/dist/VirtualMasonry.d.ts +35 -0
- package/dist/VirtualMasonry.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +674 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +680 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/VirtualMasonry.tsx","../src/FullWidthEqualHeightMasonry.tsx","../node_modules/tslib/tslib.es6.js","../src/DynamicMasonryView.tsx"],"sourcesContent":["import React, {\n useState,\n useEffect,\n useRef,\n useMemo,\n useLayoutEffect,\n useCallback,\n} from \"react\";\n\ntype VirtualMasonryCoreProps = {\n items: any[];\n renderItem: (item: any, index: number) => React.ReactNode;\n onLoadMore?: () => void;\n minColumnWidth?: number;\n maxColumnWidth?: number;\n gap?: number;\n buffer?: number;\n hasMore?: boolean;\n loading?: boolean;\n loadMoreThreshold?: number;\n};\n\n// RAF 节流 Hook - 使用 requestAnimationFrame 优化滚动性能\nfunction useRafThrottle<T>(value: T): T {\n const [throttledValue, setThrottledValue] = useState(value);\n const rafRef = useRef<number | null>(null);\n const valueRef = useRef(value);\n\n useEffect(() => {\n valueRef.current = value;\n\n if (rafRef.current !== null) {\n return;\n }\n\n rafRef.current = requestAnimationFrame(() => {\n setThrottledValue(valueRef.current);\n rafRef.current = null;\n });\n\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n };\n }, [value]);\n\n return throttledValue;\n}\n\n// ==================== 布局算法 Hook ====================\nfunction useMasonryLayout(\n items: any[],\n containerWidth: number,\n minColumnWidth = 200,\n maxColumnWidth?: number,\n gap = 16,\n) {\n const columnCount = useMemo(() => {\n let cols = Math.max(1, Math.floor(containerWidth / minColumnWidth));\n\n if (maxColumnWidth) {\n const calculatedWidth = (containerWidth - gap * (cols - 1)) / cols;\n while (calculatedWidth > maxColumnWidth && cols < 20) {\n cols++;\n const newWidth = (containerWidth - gap * (cols - 1)) / cols;\n if (newWidth <= maxColumnWidth) break;\n }\n }\n\n return cols;\n }, [containerWidth, minColumnWidth, maxColumnWidth, gap]);\n\n const layout = useMemo(() => {\n if (!containerWidth) return [];\n const columnHeights = Array(columnCount).fill(0);\n let columnWidth = (containerWidth - gap * (columnCount - 1)) / columnCount;\n\n if (maxColumnWidth && columnWidth > maxColumnWidth) {\n columnWidth = maxColumnWidth;\n }\n\n return items.map((item) => {\n const minCol = columnHeights.indexOf(Math.min(...columnHeights));\n const x = (columnWidth + gap) * minCol;\n const y = columnHeights[minCol];\n\n const aspectRatio = item.height / item.width;\n const scaledHeight = columnWidth * aspectRatio;\n\n columnHeights[minCol] += scaledHeight + gap;\n\n return {\n ...item,\n x,\n y,\n width: columnWidth,\n height: scaledHeight,\n };\n });\n }, [items, columnCount, containerWidth, maxColumnWidth, gap]);\n\n const totalHeight = useMemo(() => {\n if (layout.length === 0) return 0;\n const columnHeights = Array(columnCount).fill(0);\n layout.forEach((item) => {\n const colIndex = Math.round(\n item.x /\n ((containerWidth - gap * (columnCount - 1)) / columnCount + gap),\n );\n columnHeights[colIndex] = Math.max(\n columnHeights[colIndex],\n item.y + item.height,\n );\n });\n return Math.max(...columnHeights);\n }, [layout, columnCount, containerWidth, gap]);\n\n return { layout, totalHeight, columnCount };\n}\n\n// ==================== 主组件 ====================\nexport function VirtualMasonryCore({\n items,\n renderItem,\n onLoadMore,\n minColumnWidth = 200,\n maxColumnWidth,\n gap = 16,\n buffer = 300,\n hasMore = true,\n loading = false,\n loadMoreThreshold = 500,\n}: VirtualMasonryCoreProps) {\n const [containerWidth, setContainerWidth] = useState(0);\n const [scrollTop, setScrollTop] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const loadMoreTriggerRef = useRef<HTMLDivElement>(null);\n\n const throttledScrollTop = useRafThrottle(scrollTop);\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const resizeObserver = new ResizeObserver(() => {\n setContainerWidth(container.clientWidth);\n });\n resizeObserver.observe(container);\n setContainerWidth(container.clientWidth);\n\n return () => resizeObserver.disconnect();\n }, []);\n\n const { layout, totalHeight } = useMasonryLayout(\n items,\n containerWidth,\n minColumnWidth,\n maxColumnWidth,\n gap,\n );\n\n const handleScroll = useCallback(() => {\n if (!containerRef.current) return;\n // 使用 getBoundingClientRect 获取准确的容器位置\n const rect = containerRef.current.getBoundingClientRect();\n // rect.top 为负数表示容器顶部已滚出视口,取其绝对值即为已滚动距离\n const scrollTop = Math.max(0, -rect.top);\n setScrollTop(scrollTop);\n }, []);\n\n useEffect(() => {\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [handleScroll]);\n\n useEffect(() => {\n if (!onLoadMore || !hasMore || loading) return;\n\n const trigger = loadMoreTriggerRef.current;\n if (!trigger) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n onLoadMore();\n }\n },\n { rootMargin: `${loadMoreThreshold}px` },\n );\n\n observer.observe(trigger);\n return () => observer.disconnect();\n }, [onLoadMore, hasMore, loading, loadMoreThreshold]);\n\n const visibleItems = useMemo(() => {\n return layout.filter((item) => {\n const viewTop = throttledScrollTop - buffer;\n const viewBottom = throttledScrollTop + window.innerHeight + buffer;\n return item.y + item.height >= viewTop && item.y <= viewBottom;\n });\n }, [layout, throttledScrollTop, buffer]);\n\n return (\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n width: \"100%\",\n minHeight: totalHeight,\n }}\n >\n {visibleItems.map((item, index) => renderItem(item, index))}\n\n {onLoadMore && (\n <div\n ref={loadMoreTriggerRef}\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n height: 1,\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n\nexport type VirtualMasonryProps = {\n mapSize?: (raw: any) => { width: number; height: number };\n renderItem: (item: any, index: number) => React.ReactNode;\n enableAnimation?: boolean;\n loadData?: (\n page: number,\n pageSize: number,\n ) => Promise<{\n data: any[];\n hasMore: boolean;\n }>;\n pageSize?: number;\n minColumnWidth?: number;\n maxColumnWidth?: number;\n gap?: number;\n buffer?: number;\n loadMoreThreshold?: number;\n};\n\nexport default function VirtualMasonry({\n mapSize,\n renderItem,\n loadData,\n pageSize = 50,\n minColumnWidth = 200,\n maxColumnWidth,\n gap = 16,\n buffer = 1500,\n loadMoreThreshold = 800,\n}: VirtualMasonryProps) {\n const [items, setItems] = useState<any[]>([]);\n const [loading, setLoading] = useState(true); // 初始设为 true,立即显示 Loader\n const [hasMore, setHasMore] = useState(true);\n const [page, setPage] = useState(1);\n\n // 防止重复初始加载\n const initialLoadRef = useRef(false);\n\n const defaultMapSize = (d: any) => ({\n width: d.width ?? d.w ?? d.imgW,\n height: d.height ?? d.h ?? d.imgH,\n });\n\n // 使用 ref 存储最新的函数引用,避免依赖变化\n const loadDataRef = useRef(loadData);\n const mapSizeRef = useRef(mapSize);\n\n useEffect(() => {\n loadDataRef.current = loadData;\n mapSizeRef.current = mapSize;\n }, [loadData, mapSize]);\n\n const handleLoadMore = useCallback(\n (force = false) => {\n // force 参数用于初始加载时跳过 loading 检查\n if (!force && loading) return;\n\n setLoading(true);\n\n if (loadDataRef.current) {\n loadDataRef\n .current(page, pageSize)\n .then(({ data, hasMore: more }) => {\n const effectiveMapSize = mapSizeRef.current ?? defaultMapSize;\n\n setItems((prev) => [\n ...prev,\n ...data.map((d) => {\n const { width, height } = effectiveMapSize(d);\n return {\n ...d,\n width,\n height,\n widthRatio: width / height,\n };\n }),\n ]);\n setHasMore(more);\n setPage((prev) => prev + 1);\n })\n .catch((error) => {\n console.error(\"Failed to load data:\", error);\n })\n .finally(() => {\n setLoading(false);\n });\n }\n },\n [loading, page, pageSize],\n );\n\n // 初始加载 - 使用 ref 防止重复调用\n useEffect(() => {\n if (!initialLoadRef.current && items.length === 0) {\n initialLoadRef.current = true;\n handleLoadMore(true); // 传入 force = true,跳过 loading 检查\n }\n }, [handleLoadMore, items.length]);\n\n return (\n <VirtualMasonryCore\n items={items}\n renderItem={renderItem}\n onLoadMore={handleLoadMore}\n minColumnWidth={minColumnWidth}\n maxColumnWidth={maxColumnWidth}\n gap={gap}\n buffer={buffer}\n hasMore={hasMore}\n loading={loading}\n loadMoreThreshold={loadMoreThreshold}\n />\n );\n}","import React, {\n useState,\n useEffect,\n useMemo,\n useRef,\n useLayoutEffect,\n useCallback,\n} from \"react\";\n\ntype FullWidthEqualHeightMasonryCoreProps = {\n items: any[];\n renderItem: (\n item: {\n x: number;\n y: number;\n width: number;\n height: number;\n [key: string]: any;\n },\n index: number,\n ) => React.ReactNode;\n onLoadMore?: () => void;\n targetRowHeight?: number;\n gap?: number;\n buffer?: number;\n hasMore?: boolean;\n loading?: boolean;\n sizeRange?: [number, number];\n maxItemWidth?: number;\n maxStretchRatio?: number;\n loadMoreThreshold?: number;\n};\n\nconst GAP = 8;\n\n// RAF 节流 Hook\nfunction useRafThrottle<T>(value: T): T {\n const [throttledValue, setThrottledValue] = useState(value);\n const rafRef = useRef<number>();\n\n useEffect(() => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n\n rafRef.current = requestAnimationFrame(() => {\n setThrottledValue(value);\n });\n\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [value]);\n\n return throttledValue;\n}\n\n// ==================== 布局算法 Hook ====================\nfunction useFullWidthFillMasonry(\n items: any[],\n containerWidth: number,\n targetRowHeight = 245,\n gap = GAP,\n sizeRange: [number, number] = [230, 260],\n maxItemWidth = 975,\n maxStretchRatio = 1.5,\n) {\n const layout = useMemo(() => {\n if (!containerWidth || items.length === 0) return [];\n\n const positioned: any[] = [];\n const [minHeight, maxHeight] = sizeRange;\n let y = 0;\n\n let i = 0;\n\n while (i < items.length) {\n let currentRow: any[] = [];\n\n let effectiveTargetRowHeight = targetRowHeight;\n\n if (i < items.length) {\n currentRow.push(items[i]);\n i++;\n }\n\n const isLastItem = i >= items.length;\n if (!isLastItem && currentRow.length === 1) {\n const firstItem = currentRow[0];\n const secondItem = items[i];\n\n let firstWidth = firstItem.widthRatio * targetRowHeight;\n let secondWidth = secondItem.widthRatio * targetRowHeight;\n let totalWidth = firstWidth + secondWidth + gap;\n\n if (totalWidth > containerWidth) {\n effectiveTargetRowHeight =\n (containerWidth - gap) /\n (firstItem.widthRatio + secondItem.widthRatio);\n\n effectiveTargetRowHeight = Math.min(\n effectiveTargetRowHeight,\n targetRowHeight,\n );\n }\n }\n\n while (i < items.length) {\n const item = items[i];\n const idealWidth = item.widthRatio * effectiveTargetRowHeight;\n\n if (currentRow.length === 1) {\n currentRow.push(item);\n i++;\n } else {\n const currentRowWidth = currentRow.reduce((sum, rowItem) => {\n return sum + rowItem.widthRatio * effectiveTargetRowHeight;\n }, 0);\n\n const totalWidthWithNew = currentRowWidth + idealWidth;\n const totalGaps = currentRow.length * gap;\n\n const requiredWidth = totalWidthWithNew + totalGaps;\n\n const currentTotalWidth =\n currentRowWidth + (currentRow.length - 1) * gap;\n\n if (requiredWidth <= containerWidth) {\n currentRow.push(item);\n i++;\n } else {\n const scaleWithNew =\n containerWidth / (totalWidthWithNew + totalGaps);\n const scaleCurrent = containerWidth / currentTotalWidth;\n\n if (\n Math.abs(scaleWithNew - 1) < Math.abs(scaleCurrent - 1) &&\n scaleWithNew <= maxStretchRatio\n ) {\n currentRow.push(item);\n i++;\n }\n break;\n }\n }\n }\n\n const isLastRow = i >= items.length;\n const totalGaps = (currentRow.length - 1) * gap;\n const availableWidth = containerWidth - totalGaps;\n\n const idealTotalWidthForScale = currentRow.reduce((sum, item) => {\n return sum + item.widthRatio * effectiveTargetRowHeight;\n }, 0);\n\n let scale = availableWidth / idealTotalWidthForScale;\n\n let adjustedRowHeight = effectiveTargetRowHeight * scale;\n\n if (isLastRow) {\n adjustedRowHeight = Math.min(\n Math.max(adjustedRowHeight, minHeight),\n targetRowHeight,\n );\n } else {\n if (scale > maxStretchRatio) {\n if (currentRow.length > 2) {\n i--;\n currentRow.pop();\n\n const newTotalGaps = (currentRow.length - 1) * gap;\n const newAvailableWidth = containerWidth - newTotalGaps;\n const newIdealWidth = currentRow.reduce((sum, item) => {\n return sum + item.widthRatio * effectiveTargetRowHeight;\n }, 0);\n scale = newAvailableWidth / newIdealWidth;\n adjustedRowHeight = effectiveTargetRowHeight * scale;\n }\n }\n\n adjustedRowHeight = Math.min(\n Math.max(adjustedRowHeight, minHeight),\n maxHeight,\n );\n }\n\n let x = 0;\n\n const idealWidths = currentRow.map(\n (item) => item.widthRatio * adjustedRowHeight,\n );\n\n const idealTotalWidth = idealWidths.reduce((sum, w) => sum + w, 0);\n\n if (isLastRow) {\n const totalGapsWidth = (currentRow.length - 1) * gap;\n const totalRequiredWidth = idealTotalWidth + totalGapsWidth;\n\n if (totalRequiredWidth > containerWidth) {\n const scale = (containerWidth - totalGapsWidth) / idealTotalWidth;\n let remainingWidth = containerWidth;\n\n currentRow.forEach((item, index) => {\n const isLast = index === currentRow.length - 1;\n let finalWidth: number;\n\n if (isLast) {\n finalWidth = remainingWidth;\n } else {\n finalWidth = Math.round(idealWidths[index] * scale);\n finalWidth = Math.min(finalWidth, maxItemWidth);\n }\n\n positioned.push({\n ...item,\n x,\n y,\n width: finalWidth,\n height: Math.round(adjustedRowHeight),\n });\n\n x += finalWidth + gap;\n remainingWidth -= finalWidth + gap;\n });\n } else {\n currentRow.forEach((item, index) => {\n const idealWidth = idealWidths[index];\n const finalWidth = Math.min(Math.round(idealWidth), maxItemWidth);\n\n positioned.push({\n ...item,\n x,\n y,\n width: finalWidth,\n height: Math.round(adjustedRowHeight),\n });\n\n x += finalWidth + gap;\n });\n }\n } else {\n let remainingWidth = containerWidth;\n let accumulatedIdealWidth = 0;\n\n currentRow.forEach((item, index) => {\n const isLast = index === currentRow.length - 1;\n let finalWidth: number;\n\n if (isLast) {\n finalWidth = remainingWidth;\n } else {\n const currentIdealWidth = idealWidths[index];\n accumulatedIdealWidth += currentIdealWidth;\n\n const targetX =\n (accumulatedIdealWidth / idealTotalWidth) * containerWidth -\n index * gap;\n\n finalWidth = Math.round(targetX - x);\n\n finalWidth = Math.min(finalWidth, maxItemWidth);\n }\n\n positioned.push({\n ...item,\n x,\n y,\n width: finalWidth,\n height: Math.round(adjustedRowHeight),\n });\n\n x += finalWidth + gap;\n remainingWidth -= finalWidth + gap;\n });\n }\n\n y += Math.round(adjustedRowHeight) + gap;\n }\n\n return positioned;\n }, [\n items,\n containerWidth,\n targetRowHeight,\n gap,\n sizeRange,\n maxItemWidth,\n maxStretchRatio,\n ]);\n\n const totalHeight = useMemo(() => {\n if (layout.length === 0) return 0;\n return layout.reduce((max, item) => Math.max(max, item.y + item.height), 0);\n }, [layout]);\n\n return { layout, totalHeight };\n}\n\n// ==================== 主组件 ====================\nexport function FullWidthEqualHeightMasonryCore({\n items,\n renderItem,\n onLoadMore,\n targetRowHeight = 245,\n gap = GAP,\n buffer = 1000,\n hasMore = true,\n loading = false,\n sizeRange = [230, 260],\n maxItemWidth = 975,\n maxStretchRatio = 1.5,\n loadMoreThreshold = 800,\n}: FullWidthEqualHeightMasonryCoreProps) {\n const [containerWidth, setContainerWidth] = useState(0);\n const [scrollTop, setScrollTop] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const loadMoreTriggerRef = useRef<HTMLDivElement>(null);\n const [containerOffsetTop, setContainerOffsetTop] = useState(0);\n\n const throttledScrollTop = useRafThrottle(scrollTop);\n\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n\n setContainerOffsetTop(containerRef.current.offsetTop);\n\n const ro = new ResizeObserver(() => {\n if (containerRef.current) {\n setContainerWidth(containerRef.current.clientWidth);\n }\n });\n\n ro.observe(containerRef.current);\n setContainerWidth(containerRef.current.clientWidth);\n\n return () => ro.disconnect();\n }, []);\n\n const { layout, totalHeight } = useFullWidthFillMasonry(\n items,\n containerWidth,\n targetRowHeight,\n gap,\n sizeRange,\n maxItemWidth,\n maxStretchRatio,\n );\n\n const handleScroll = useCallback(() => {\n const scrollY = window.scrollY || window.pageYOffset;\n setScrollTop(Math.max(0, scrollY - containerOffsetTop));\n }, [containerOffsetTop]);\n\n useEffect(() => {\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [handleScroll]);\n\n useEffect(() => {\n if (!onLoadMore || !hasMore || loading) return;\n\n const trigger = loadMoreTriggerRef.current;\n if (!trigger) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n onLoadMore();\n }\n },\n { rootMargin: `${loadMoreThreshold}px` },\n );\n\n observer.observe(trigger);\n return () => observer.disconnect();\n }, [onLoadMore, hasMore, loading, loadMoreThreshold]);\n\n const visibleItems = useMemo(() => {\n return layout\n .map((item, originalIndex) => ({ ...item, originalIndex }))\n .filter((item) => {\n const viewTop = throttledScrollTop - buffer;\n const viewBottom = throttledScrollTop + window.innerHeight + buffer;\n return item.y + item.height >= viewTop && item.y <= viewBottom;\n });\n }, [layout, throttledScrollTop, buffer]);\n\n return (\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n width: \"100%\",\n minHeight: totalHeight,\n }}\n >\n {visibleItems.map((item) => (\n <React.Fragment key={item.originalIndex}>\n {renderItem(item, item.originalIndex)}\n </React.Fragment>\n ))}\n\n {onLoadMore && (\n <div\n ref={loadMoreTriggerRef}\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n height: 1,\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n\n// ==================== Props 类型定义 ====================\ntype FullWidthEqualHeightMasonryProps = {\n mapSize?: (raw: any) => { width: number; height: number };\n renderItem: (\n item: {\n x: number;\n y: number;\n width: number;\n height: number;\n [key: string]: any;\n },\n index: number,\n ) => React.ReactNode;\n enableAnimation?: boolean;\n loadData?: (\n page: number,\n pageSize: number,\n ) => Promise<{\n data: any[];\n hasMore: boolean;\n }>;\n pageSize?: number;\n targetRowHeight?: number;\n sizeRange?: [number, number];\n maxItemWidth?: number;\n maxStretchRatio?: number;\n gap?: number;\n buffer?: number;\n loadMoreThreshold?: number;\n};\n\nexport default function FullWidthEqualHeightMasonry({\n mapSize,\n renderItem,\n enableAnimation: _enableAnimation = true,\n loadData,\n pageSize = 50,\n targetRowHeight = 245,\n sizeRange = [230, 260],\n maxItemWidth = 975,\n maxStretchRatio = 1.5,\n gap = GAP,\n buffer = 1500,\n loadMoreThreshold = 500,\n}: FullWidthEqualHeightMasonryProps) {\n const [items, setItems] = useState<any[]>([]);\n const [loading, setLoading] = useState(true); // 初始设为 true,立即显示 Loader\n const [hasMore, setHasMore] = useState(true);\n const [page, setPage] = useState(1);\n\n // 防止重复初始加载\n const initialLoadRef = useRef(false);\n\n const defaultMapSize = (d: any) => ({\n width: d.width ?? d.w ?? d.imgW,\n height: d.height ?? d.h ?? d.imgH,\n });\n\n // 使用 ref 存储最新的函数引用,避免依赖变化\n const loadDataRef = useRef(loadData);\n const mapSizeRef = useRef(mapSize);\n\n useEffect(() => {\n loadDataRef.current = loadData;\n mapSizeRef.current = mapSize;\n }, [loadData, mapSize]);\n\n const handleLoadMore = useCallback(\n (force = false) => {\n // force 参数用于初始加载时跳过 loading 检查\n if (!force && loading) return;\n\n setLoading(true);\n\n if (loadDataRef.current) {\n loadDataRef\n .current(page, pageSize)\n .then(({ data, hasMore: more }) => {\n const effectiveMapSize = mapSizeRef.current ?? defaultMapSize;\n\n setItems((prev) => [\n ...prev,\n ...data.map((d) => {\n const { width, height } = effectiveMapSize(d);\n return {\n ...d,\n width,\n height,\n widthRatio: width / height,\n };\n }),\n ]);\n setHasMore(more);\n setPage((prev) => prev + 1);\n })\n .catch((error) => {\n console.error(\"Failed to load data:\", error);\n })\n .finally(() => {\n setLoading(false);\n });\n }\n },\n [loading, page, pageSize],\n );\n\n // 初始加载 - 使用 ref 防止重复调用\n useEffect(() => {\n if (!initialLoadRef.current && items.length === 0) {\n initialLoadRef.current = true;\n handleLoadMore(true); // 传入 force = true,跳过 loading 检查\n }\n }, [handleLoadMore, items.length]);\n\n return (\n <FullWidthEqualHeightMasonryCore\n items={items}\n renderItem={renderItem}\n onLoadMore={handleLoadMore}\n targetRowHeight={targetRowHeight}\n sizeRange={sizeRange}\n maxItemWidth={maxItemWidth}\n maxStretchRatio={maxStretchRatio}\n gap={gap}\n buffer={buffer}\n hasMore={hasMore}\n loading={loading}\n loadMoreThreshold={loadMoreThreshold}\n />\n );\n}","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport VirtualMasonry from \"./VirtualMasonry\";\nimport FullWidthEqualHeightMasonry from \"./FullWidthEqualHeightMasonry\";\n\n// ==================== 类型定义 ====================\n\n/**\n * 视图类型枚举\n * 1 - 瀑布流(不等宽不等高)\n * 2 - 等高不等宽\n */\nexport enum ViewType {\n WATERFALL = 1,\n EQUAL_HEIGHT = 2,\n}\n\n/**\n * 数据加载函数\n * 第一次调用时(page === 1)会返回布局类型\n * 后续调用不返回布局类型\n */\nexport type LoadDataFn<T = any> = (\n page: number,\n pageSize: number,\n) => Promise<{\n data: T[];\n hasMore: boolean;\n isMasonry?: boolean;\n}>;\n\n/**\n * 组件 Props\n */\nexport interface DynamicMasonryViewProps<T = any> {\n /**\n * 是否使用瀑布流布局(受控模式)\n */\n isMasonry?: boolean;\n\n /**\n * 默认是否使用瀑布流布局(非受控模式)\n */\n defaultIsMasonry?: boolean;\n\n /**\n * 是否启用动画\n */\n enableAnimation?: boolean;\n\n /**\n * 映射宽高\n */\n mapSize?: (raw: any) => { width: number; height: number };\n\n /**\n * 瀑布流配置\n */\n waterfallConfig?: {\n minColumnWidth?: number;\n maxColumnWidth?: number;\n gap?: number;\n buffer?: number;\n };\n\n /**\n * 等高不等宽配置\n */\n equalHeightConfig?: {\n targetRowHeight?: number;\n sizeRange?: [number, number];\n maxItemWidth?: number;\n maxStretchRatio?: number;\n gap?: number;\n buffer?: number;\n };\n\n /**\n * 自定义初始加载状态\n */\n renderInitialLoader?: () => React.ReactNode;\n\n /**\n * 自定义数据加载函数\n */\n loadData?: LoadDataFn<T>;\n\n /**\n * 每页数据条数\n */\n pageSize?: number;\n\n /**\n * 自定义渲染项\n */\n renderItem: (item: any, index: number, isMasonry: boolean) => React.ReactNode;\n\n /**\n * 布局类型加载完成回调\n */\n onLayoutTypeLoaded?: (isMasonry: boolean) => void;\n\n /**\n * 数据加载错误回调\n */\n onError?: (error: Error) => void;\n}\n\n// ==================== 主组件 ====================\n\n/**\n * 动态瀑布流视图组件\n *\n * 支持两种视图模式:\n * 1. 瀑布流(不等宽不等高) - Pinterest 风格\n * 2. 等高不等宽 - Google Photos 风格\n */\nexport default function DynamicMasonryView<T = any>({\n isMasonry: controlledIsMasonry,\n defaultIsMasonry = true,\n enableAnimation = true,\n waterfallConfig = {},\n equalHeightConfig = {},\n loadData,\n pageSize = 50,\n renderItem,\n mapSize,\n renderInitialLoader,\n onLayoutTypeLoaded,\n onError,\n}: DynamicMasonryViewProps<T>) {\n // ==================== 状态管理 ====================\n\n const [isMasonry, setIsMasonry] = useState<boolean | null>(\n controlledIsMasonry ?? null,\n );\n const [layoutTypeLoading, setLayoutTypeLoading] = useState(\n controlledIsMasonry === undefined,\n );\n const [firstPageData, setFirstPageData] = useState<{\n data: T[];\n hasMore: boolean;\n } | null>(null);\n\n const loadDataRef = React.useRef(loadData);\n const onLayoutTypeLoadedRef = React.useRef(onLayoutTypeLoaded);\n const onErrorRef = React.useRef(onError);\n\n React.useEffect(() => {\n loadDataRef.current = loadData;\n onLayoutTypeLoadedRef.current = onLayoutTypeLoaded;\n onErrorRef.current = onError;\n }, [loadData, onLayoutTypeLoaded, onError]);\n\n // ==================== 包装的数据加载函数 ====================\n\n const wrappedLoadData = useCallback(\n async (page: number, size: number) => {\n if (!loadDataRef.current) {\n return { data: [], hasMore: false };\n }\n\n if (page === 1 && firstPageData) {\n const cached = firstPageData;\n setFirstPageData(null);\n return cached;\n }\n\n const result = await loadDataRef.current(page, size);\n\n return {\n data: result.data,\n hasMore: result.hasMore,\n };\n },\n [firstPageData],\n );\n\n // ==================== 初始化布局类型 ====================\n\n useEffect(() => {\n if (controlledIsMasonry !== undefined) {\n setIsMasonry(controlledIsMasonry);\n setLayoutTypeLoading(false);\n onLayoutTypeLoadedRef.current?.(controlledIsMasonry);\n }\n }, [controlledIsMasonry]);\n\n const initializedRef = React.useRef(false);\n\n useEffect(() => {\n if (controlledIsMasonry !== undefined) {\n return;\n }\n\n if (initializedRef.current) {\n return;\n }\n\n const initializeLayoutType = async () => {\n try {\n setLayoutTypeLoading(true);\n initializedRef.current = true;\n\n if (loadDataRef.current) {\n const result = await loadDataRef.current(1, pageSize);\n\n setFirstPageData({\n data: result.data,\n hasMore: result.hasMore,\n });\n\n if (result.isMasonry !== undefined) {\n setIsMasonry(result.isMasonry);\n onLayoutTypeLoadedRef.current?.(result.isMasonry);\n } else {\n setIsMasonry(defaultIsMasonry);\n onLayoutTypeLoadedRef.current?.(defaultIsMasonry);\n }\n } else {\n setIsMasonry(defaultIsMasonry);\n onLayoutTypeLoadedRef.current?.(defaultIsMasonry);\n }\n } catch (error) {\n console.error(\"Failed to load layout type:\", error);\n onErrorRef.current?.(error as Error);\n setIsMasonry(defaultIsMasonry);\n } finally {\n setLayoutTypeLoading(false);\n }\n };\n\n initializeLayoutType();\n // 只在 controlledIsMasonry, pageSize 变化时重新初始化\n // 移除 defaultIsMasonry 依赖,避免接口返回后更新 layoutType 导致重复初始化\n // loadData 等函数通过 ref 访问,不需要作为依赖项\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [controlledIsMasonry, pageSize]);\n\n // ==================== 渲染逻辑 ====================\n\n if (layoutTypeLoading || isMasonry === null) {\n // 使用自定义初始加载状态,或使用默认占位符\n if (renderInitialLoader) {\n return <>{renderInitialLoader()}</>;\n }\n // 默认占位符\n return (\n <div\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n />\n );\n }\n\n if (isMasonry) {\n return (\n <VirtualMasonry\n renderItem={(item, index) => renderItem(item, index, true)}\n enableAnimation={enableAnimation}\n loadData={wrappedLoadData}\n pageSize={pageSize}\n minColumnWidth={waterfallConfig.minColumnWidth}\n maxColumnWidth={waterfallConfig.maxColumnWidth}\n gap={waterfallConfig.gap}\n buffer={waterfallConfig.buffer}\n mapSize={mapSize}\n />\n );\n }\n\n return (\n <FullWidthEqualHeightMasonry\n renderItem={(item, index) => renderItem(item, index, false)}\n enableAnimation={enableAnimation}\n loadData={wrappedLoadData}\n pageSize={pageSize}\n targetRowHeight={equalHeightConfig.targetRowHeight}\n sizeRange={equalHeightConfig.sizeRange}\n maxItemWidth={equalHeightConfig.maxItemWidth}\n maxStretchRatio={equalHeightConfig.maxStretchRatio}\n gap={equalHeightConfig.gap}\n buffer={equalHeightConfig.buffer}\n mapSize={mapSize}\n />\n );\n}"],"names":["useRafThrottle"],"mappings":"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","x_google_ignoreList":[2]}
|