import React, { useEffect, useMemo, useRef } from 'react'; import { ResizeWatcher } from './ResizeWatcher'; import { Scroller, ScrollerRef } from './Scroller'; import { useUpdate } from 'ahooks'; interface VirtualChatListProps { className?: string; style?: React.CSSProperties; innerStyle?: React.CSSProperties; getItemKey?: (item: ItemType) => string; items: ItemType[]; itemContent: (item: ItemType, index: number) => React.ReactNode; } const defaultContainerStyle: React.CSSProperties = { overflow: 'hidden', }; const defaultInnerStyle: React.CSSProperties = { height: '100%', }; const scrollerStyle: React.CSSProperties = { height: '100%', }; const InternalVirtualChatList = ( props: VirtualChatListProps ) => { const scrollerRef = useRef(null); const itemHeightCache = useMemo(() => new Map(), []); const forceUpdate = useUpdate(); const style = useMemo( () => ({ ...defaultContainerStyle, ...props.style, }), [props.style] ); const innerStyle = useMemo( () => ({ ...defaultInnerStyle, ...props.innerStyle, }), [props.innerStyle] ); useEffect(() => { // 挂载后滚动到底部 scrollerRef.current?.scrollToBottom(); }, []); return (
{props.items.map((item, i) => (
{ itemHeightCache.set(item, size.height); forceUpdate(); }} > {props.itemContent(item, i)}
))}
); }; type VirtualChatListInterface = typeof InternalVirtualChatList & React.FC; export const VirtualChatList: VirtualChatListInterface = React.memo( InternalVirtualChatList ) as any; VirtualChatList.displayName = 'VirtualChatList';