import React, { HTMLAttributes, ReactNode, useCallback, useState } from 'react'; import styled from 'styled-components'; import Button from '../Button/Button'; import Skeleton from '../Skeleton/Skeleton'; import SkeletonItem from '../Skeleton/SkeletonItem'; import Pagination from '../Pagination/Pagination '; export interface ListProps extends HTMLAttributes { data: any[]; renderItem: (item: any) => ReactNode; loadMoreCallback?: () => void; paginateCallback?: (start: number) => void; isLoading?: boolean; isLoadFinish?: boolean; model: 'loadMore' | 'pagination' | 'normal'; totalData?: number; perPage?: number; } const ListStyled = styled.div` border: 1px solid rgba(0, 0, 0, 0.1); width: 100%; padding: 20px 20px; display: flex; flex-direction: column; scroll-behavior: smooth; `; const LoadMore = styled.div` width: 100%; margin-top: 40px; display: flex; justify-content: center; `; const List: React.FC = (props) => { const { renderItem, model, perPage, totalData, loadMoreCallback, paginateCallback, isLoading, isLoadFinish, data } = props; const [currentPage, setPage] = useState(1); const fn = useCallback((page: number, start: number) => { paginateCallback!(start); setPage(page); }, []); const bottomRender = () => { if (model === 'normal') { return ''; } if (model === 'loadMore') { return ( {isLoadFinish ? ( 没有更多了, 返回顶部? ) : ( )} ); } if (model === 'pagination') { return ( ); } }; return ( {data.map((item) => renderItem(item))} {bottomRender()} ); }; List.defaultProps = { loadMoreCallback: () => {}, paginateCallback: () => {}, isLoading: false, isLoadFinish: false, totalData: 0, perPage: 5 }; export default List;