/
Row.js
50 lines (43 loc) 路 1.06 KB
/
Row.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* eslint-disable jsx-a11y/accessible-emoji */
import { useState, forwardRef } from "react";
import useVirtual from "react-cool-virtual";
import "./styles.scss";
const AccordionItem = forwardRef(({ children, height, ...rest }, ref) => {
const [h, setH] = useState(height);
return (
<div
{...rest}
style={{ height: `${h}px` }}
ref={ref}
onClick={() => setH((prevH) => (prevH === 50 ? 100 : 50))}
>
{children}
</div>
);
});
const Row = () => {
const { outerRef, innerRef, items } = useVirtual({
itemCount: 50
});
return (
<div
className="outer"
style={{ width: "300px", height: "300px", overflow: "auto" }}
ref={outerRef}
>
<div ref={innerRef}>
{items.map(({ index, size, measureRef }) => (
<AccordionItem
key={index}
className={`item ${index % 2 ? "dark" : ""}`}
height={size}
ref={measureRef}
>
馃憢馃徎 Click Me
</AccordionItem>
))}
</div>
</div>
);
};
export default Row;