UNPKG

@wenghongtian/react-virtual-list

Version:
107 lines (91 loc) 3.1 kB
# react-virtual-list react不定高虚拟列表,支持高度自动计算。 ### VirtualListProps | 名称 | 描述 | 默认值 | | -------------- | -------------------- | ------------------------------------- | | renderItem | *子项渲染函数* | `(data: T, index: number)=>ReactNode` | | bufferSize | 缓存大小 | 5 | | itemOffset | 每一项的间隔 | 10 | | estimateHeight | 每一项预期高度 | 100 | | empty | 数据为空时渲染的节点 | `'暂无数据~'` | | rowKey | 每行的key值 | 无 | | onScroll | | 无 | | request | 请求数据方式 | | | pagination | 分页配置 | `{current: 1, pageSize: 20}` | | loadingRender | loading时渲染的节点 | | | noMoreRender | 没有更多时渲染的节点 | | ### Example ```tsx import { useState } from "react"; import VirtualList from "@wenghongtian/react-virtual-list"; import from "@wenghongtian/react-virtual-list/lib/style.css" const sleep = (timeout: number) => { return new Promise<void>((resolve) => { setTimeout(() => { resolve(); }, timeout); }); }; function getRandomColor() { const letters = "0123456789ABCDEF"; let color = "#"; for (let i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; } function getRandomHeight() { return (Math.random() * 300 + 100) | 0; } function Item(props: { name: string; color: string; delayHeight: number; height: number; }) { const [height, setHeight] = useState(props.height); // useEffect(() => { // setTimeout(() => { // setHeight(props.delayHeight); // }, 500); // }, []); return ( <div style={{ backgroundColor: props.color, height }}> <div>{props.name}</div> <button onClick={() => setHeight(getRandomHeight)}>设置高度</button> </div> ); } type Data = { name: string; color: string; height: number; delayHeight: number; id: string; }; const App = () => { return ( <div style={{ height: "100%" }}> <VirtualList<Data> renderItem={(data) => { return <Item {...data} />; }} request={async ({ pageSize, current }) => { await sleep(1000); return { list: new Array(10).fill("").map((_i, index) => ({ name: Math.random() + "", color: getRandomColor(), height: getRandomHeight(), delayHeight: getRandomHeight(), id: pageSize * (current - 1) + index + "", })), noMore: current > 5, }; }} /> </div> ); }; export default App; ```