@@ -28,16 +28,10 @@ export const FileList: React.FC<FileListProps> = ({
2828 onCopy,
2929} ) => {
3030 const [ filteredFiles , setFilteredFiles ] = useState < WinFileInfo [ ] > ( files ) ;
31- const [ scrollTop , setScrollTop ] = useState ( 0 ) ;
32-
33- const ROW_HEIGHT = 86 ;
34- const CONTAINER_HEIGHT = 520 ;
35- const OVERSCAN = 6 ;
3631
3732 // 当外部 files 变化时更新过滤列表
3833 React . useEffect ( ( ) => {
3934 setFilteredFiles ( files ) ;
40- setScrollTop ( 0 ) ;
4135 } , [ files ] ) ;
4236
4337 /**
@@ -47,50 +41,6 @@ export const FileList: React.FC<FileListProps> = ({
4741 setFilteredFiles ( newFilteredFiles ) ;
4842 } , [ ] ) ;
4943
50- const visibleRange = useMemo ( ( ) => {
51- const start = Math . max ( 0 , Math . floor ( scrollTop / ROW_HEIGHT ) - OVERSCAN ) ;
52- const visibleCount = Math . ceil ( CONTAINER_HEIGHT / ROW_HEIGHT ) + OVERSCAN * 2 ;
53- const end = Math . min ( filteredFiles . length , start + visibleCount ) ;
54- return { start, end } ;
55- } , [ filteredFiles . length , scrollTop ] ) ;
56-
57- const visibleRows = useMemo ( ( ) => {
58- return filteredFiles . slice ( visibleRange . start , visibleRange . end ) . map ( ( info , offset ) => {
59- const index = visibleRange . start + offset ;
60- const top = index * ROW_HEIGHT ;
61- return (
62- < List . ListItem className = "file-list-row file-list-row-virtual" style = { { top } } key = { `${ info . FileName } -${ index } ` } >
63- < div className = "file-list-main" >
64- < div className = "file-list-title" >
65- { `Windows ${ info . SystemCode } ${ info . VerCode } (${ info . BuildVer } )` }
66- </ div >
67- < div className = "file-list-meta" >
68- < span > { info . Language } </ span >
69- < span > { info . Edition } </ span >
70- < span > { info . Architecture } </ span >
71- < span > { formatFileSize ( info . Size ) } </ span >
72- < span > SHA: { info . Sha256 || info . Sha1 || '-' } </ span >
73- </ div >
74- </ div >
75- < Space className = "file-list-actions" size = "small" >
76- < Link theme = "primary" hover = "color" onClick = { ( ) => onDownload ( info . FilePath ) } >
77- 下载
78- </ Link >
79- < Link theme = "primary" hover = "color" onClick = { ( ) => onCopy ( info . FilePath ) } >
80- 复制直链
81- </ Link >
82- </ Space >
83- </ List . ListItem >
84- ) ;
85- } ) ;
86- } , [ filteredFiles , onCopy , onDownload , visibleRange ] ) ;
87-
88- const totalHeight = filteredFiles . length * ROW_HEIGHT ;
89-
90- const handleScroll = useCallback ( ( event : React . UIEvent < HTMLDivElement > ) => {
91- setScrollTop ( event . currentTarget . scrollTop ) ;
92- } , [ ] ) ;
93-
9444 const renderRows = useMemo ( ( ) => {
9545 return filteredFiles . map ( ( info , index ) => (
9646 < List . ListItem className = "file-list-row" key = { `${ info . FileName } -${ index } ` } >
@@ -136,15 +86,7 @@ export const FileList: React.FC<FileListProps> = ({
13686 没有找到匹配的文件
13787 </ div >
13888 ) : (
139- filteredFiles . length <= 30 ? (
140- < List className = "file-list-wrap" > { renderRows } </ List >
141- ) : (
142- < div className = "file-list-virtual" style = { { height : CONTAINER_HEIGHT } } onScroll = { handleScroll } >
143- < List className = "file-list-virtual-inner" style = { { height : totalHeight } } >
144- { visibleRows }
145- </ List >
146- </ div >
147- )
89+ < List className = "file-list-wrap" > { renderRows } </ List >
14890 ) }
14991 </ div >
15092 ) ;
0 commit comments