-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(listbox): virtualization #4206
Changes from 1 commit
200da2c
9ed57fc
9f59894
3e8f7bf
4acc232
8111393
19abaec
792a567
7fb1371
1523ca7
e4bd399
5e8281b
30b62e2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,57 @@ | ||||||||||||||||||||||
import {Listbox, ListboxItem} from "@nextui-org/react"; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const generateItems = (n) => { | ||||||||||||||||||||||
const items = [ | ||||||||||||||||||||||
"Cat", | ||||||||||||||||||||||
"Dog", | ||||||||||||||||||||||
"Elephant", | ||||||||||||||||||||||
"Lion", | ||||||||||||||||||||||
"Tiger", | ||||||||||||||||||||||
"Giraffe", | ||||||||||||||||||||||
"Dolphin", | ||||||||||||||||||||||
"Penguin", | ||||||||||||||||||||||
"Zebra", | ||||||||||||||||||||||
"Shark", | ||||||||||||||||||||||
"Whale", | ||||||||||||||||||||||
"Otter", | ||||||||||||||||||||||
"Crocodile", | ||||||||||||||||||||||
]; | ||||||||||||||||||||||
|
||||||||||||||||||||||
const dataset = []; | ||||||||||||||||||||||
|
||||||||||||||||||||||
for (let i = 0; i < n; i++) { | ||||||||||||||||||||||
const item = items[i % items.length]; | ||||||||||||||||||||||
|
||||||||||||||||||||||
dataset.push({ | ||||||||||||||||||||||
label: `${item}${i}`, | ||||||||||||||||||||||
value: `${item.toLowerCase()}${i}`, | ||||||||||||||||||||||
description: "Sample description", | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
return dataset; | ||||||||||||||||||||||
}; | ||||||||||||||||||||||
|
||||||||||||||||||||||
export default function App() { | ||||||||||||||||||||||
const items = generateItems(1000); | ||||||||||||||||||||||
|
||||||||||||||||||||||
return ( | ||||||||||||||||||||||
<div className="flex w-full flex-wrap md:flex-nowrap gap-4"> | ||||||||||||||||||||||
<Listbox | ||||||||||||||||||||||
isVirtualized | ||||||||||||||||||||||
label={"Select from 10000 items"} | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix incorrect item count in label The label mentions "10000 items" but the component only generates 1000 items. -label={"Select from 10000 items"}
+label={"Select from 1000 items"} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||
placeholder="Select..." | ||||||||||||||||||||||
virtualization={{ | ||||||||||||||||||||||
maxListboxHeight: 400, | ||||||||||||||||||||||
itemHeight: 40, | ||||||||||||||||||||||
}} | ||||||||||||||||||||||
> | ||||||||||||||||||||||
{items.map((item, index) => ( | ||||||||||||||||||||||
<ListboxItem key={index} value={item.value}> | ||||||||||||||||||||||
{item.label} | ||||||||||||||||||||||
</ListboxItem> | ||||||||||||||||||||||
))} | ||||||||||||||||||||||
Comment on lines
+49
to
+53
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid using array index as React key Using array indices as keys can lead to performance issues and bugs with item state when the list is modified. Since each item has a unique value, use that instead. -<ListboxItem key={index} value={item.value}>
+<ListboxItem key={item.value} value={item.value}> 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||
</Listbox> | ||||||||||||||||||||||
</div> | ||||||||||||||||||||||
); | ||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import App from "./virtualization-ten-thousand.raw.jsx?raw"; | ||
|
||
const react = { | ||
"/App.jsx": App, | ||
}; | ||
|
||
export default { | ||
...react, | ||
}; |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,56 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {Listbox, ListboxItem} from "@nextui-org/react"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const generateItems = (n) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const items = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Cat", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Dog", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Elephant", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Lion", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Tiger", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Giraffe", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Dolphin", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Penguin", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Zebra", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Shark", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Whale", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Otter", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Crocodile", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const dataset = []; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (let i = 0; i < n; i++) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const item = items[i % items.length]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dataset.push({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
label: `${item}${i}`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value: `${item.toLowerCase()}${i}`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
description: "Sample description", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return dataset; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export default function App() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const items = generateItems(1000); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="flex w-full flex-wrap md:flex-nowrap gap-4"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Listbox | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isVirtualized | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
label={"Select from 1000 items"} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
placeholder="Select..." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
virtualization={{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
maxListboxHeight: 400, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
itemHeight: 40, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{items.map((item, index) => ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<ListboxItem key={index} value={item.value}> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{item.label} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</ListboxItem> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
))} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Listbox> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+34
to
+56
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Address potential performance and accessibility concerns Several improvements could enhance the component's robustness:
Consider these improvements: export default function App() {
const items = generateItems(1000);
+ const containerRef = useRef(null);
+ const [maxHeight, setMaxHeight] = useState(400);
+
+ useEffect(() => {
+ const updateHeight = () => {
+ if (containerRef.current) {
+ setMaxHeight(window.innerHeight * 0.6);
+ }
+ };
+ window.addEventListener('resize', updateHeight);
+ updateHeight();
+ return () => window.removeEventListener('resize', updateHeight);
+ }, []);
return (
- <div className="flex w-full flex-wrap md:flex-nowrap gap-4">
+ <div ref={containerRef} className="flex w-full flex-wrap md:flex-nowrap gap-4">
<Listbox
isVirtualized
+ aria-label="Select an animal"
label={"Select from 1000 items"}
placeholder="Select..."
virtualization={{
- maxListboxHeight: 400,
+ maxListboxHeight: maxHeight,
itemHeight: 40,
}}
>
{items.map((item, index) => (
- <ListboxItem key={index} value={item.value}>
+ <ListboxItem key={item.value} value={item.value}>
{item.label}
</ListboxItem>
))}
</Listbox>
</div>
);
} 📝 Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import App from "./virtualization.raw.jsx?raw"; | ||
|
||
const react = { | ||
"/App.jsx": App, | ||
}; | ||
|
||
export default { | ||
...react, | ||
}; |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -151,6 +151,22 @@ function App() { | |||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
### Virtualization | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
Select supports virtualization, which allows efficient rendering of large lists by only rendering items that are visible in the viewport. You can enable virtualization by setting the `isVirtualized` prop to `true`. | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
<CodeDemo | ||||||||||||||||||||||||||||||||||||||||||
title="Virtualization" | ||||||||||||||||||||||||||||||||||||||||||
files={listboxContent.virtualization} | ||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
> **Note**: The virtualization strategy is based on the [@tanstack/react-virtual](https://tanstack.com/virtual/latest) package, which provides efficient rendering of large lists by only rendering items that are visible in the viewport. | ||||||||||||||||||||||||||||||||||||||||||
#### Ten Thousand Items | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
Here's an example of using virtualization with 10,000 items. | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
<CodeDemo title="Ten Thousand Items" files={listboxContent.virtualizationTenThousand} /> | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
## Slots | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
Listbox has 3 components with slots the base one `Listbox`, `ListboxItem` and `ListboxSection` components. | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -328,6 +344,18 @@ You can customize the `Listbox` items style by using the `itemClasses` prop and | |||||||||||||||||||||||||||||||||||||||||
type: "boolean", | ||||||||||||||||||||||||||||||||||||||||||
description: "Whether keyboard navigation is circular.", | ||||||||||||||||||||||||||||||||||||||||||
default: "false" | ||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||
attribute: "isVirtualized", | ||||||||||||||||||||||||||||||||||||||||||
type: "boolean", | ||||||||||||||||||||||||||||||||||||||||||
description: "Whether to enable virtualization.", | ||||||||||||||||||||||||||||||||||||||||||
default: "false" | ||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||
attribute: "virtualization", | ||||||||||||||||||||||||||||||||||||||||||
type: "Record<\"maxListboxHeight\" & \"itemHeight\", number>", | ||||||||||||||||||||||||||||||||||||||||||
description: "Configuration for virtualization, optimizing rendering for large datasets. Required if isVirtualized is set to true.", | ||||||||||||||||||||||||||||||||||||||||||
default: "-", | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+349
to
+358
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Correct Type Definition for 'virtualization' Prop The type for the Apply this diff to correct the type definition: - type: "Record<\"maxListboxHeight\" & \"itemHeight\", number>",
+ type: "{ maxListboxHeight: number; itemHeight: number }", 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||
attribute: "hideEmptyContent", | ||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -679,6 +679,59 @@ const CustomWithClassNamesTemplate = ({color, variant, disableAnimation, ...args | |
); | ||
}; | ||
|
||
interface LargeDatasetSchema { | ||
label: string; | ||
value: string; | ||
description: string; | ||
} | ||
|
||
function generateLargeDataset(n: number): LargeDatasetSchema[] { | ||
const dataset: LargeDatasetSchema[] = []; | ||
const items = [ | ||
"Cat", | ||
"Dog", | ||
"Elephant", | ||
"Lion", | ||
"Tiger", | ||
"Giraffe", | ||
"Dolphin", | ||
"Penguin", | ||
"Zebra", | ||
"Shark", | ||
"Whale", | ||
"Otter", | ||
"Crocodile", | ||
]; | ||
|
||
for (let i = 0; i < n; i++) { | ||
const item = items[i % items.length]; | ||
|
||
dataset.push({ | ||
label: `${item}${i}`, | ||
value: `${item.toLowerCase()}${i}`, | ||
description: "Sample description", | ||
}); | ||
} | ||
|
||
return dataset; | ||
} | ||
|
||
const LargeDatasetTemplate = (args: ListboxProps & {numItems: number}) => { | ||
const largeDataset = generateLargeDataset(args.numItems); | ||
|
||
return ( | ||
<div className="flex w-full max-w-full py-20 px-20"> | ||
<Listbox label={`Select from ${args.numItems} items`} {...args}> | ||
{largeDataset.map((item, index) => ( | ||
<ListboxItem key={index} value={item.value}> | ||
{item.label} | ||
</ListboxItem> | ||
Comment on lines
+726
to
+728
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Use Stable Keys for List Items In the Apply this diff to use stable keys: - {largeDataset.map((item, index) => (
- <ListboxItem key={index} value={item.value}>
+ {largeDataset.map((item) => (
+ <ListboxItem key={item.value} value={item.value}>
{item.label}
</ListboxItem>
))}
|
||
))} | ||
</Listbox> | ||
</div> | ||
); | ||
}; | ||
|
||
export const Default = { | ||
render: Template, | ||
args: { | ||
|
@@ -782,3 +835,55 @@ export const CustomWithClassNames = { | |
...defaultProps, | ||
}, | ||
}; | ||
|
||
export const OneThousandList = { | ||
render: LargeDatasetTemplate, | ||
args: { | ||
...defaultProps, | ||
numItems: 1000, | ||
isVirtualized: true, | ||
virtualization: { | ||
maxListboxHeight: 400, | ||
itemHeight: 20, | ||
}, | ||
}, | ||
}; | ||
|
||
export const TenThousandList = { | ||
render: LargeDatasetTemplate, | ||
args: { | ||
...defaultProps, | ||
numItems: 10000, | ||
isVirtualized: true, | ||
virtualization: { | ||
maxListboxHeight: 400, | ||
itemHeight: 20, | ||
}, | ||
}, | ||
}; | ||
|
||
export const CustomMaxListboxHeight = { | ||
render: LargeDatasetTemplate, | ||
args: { | ||
...defaultProps, | ||
numItems: 1000, | ||
isVirtualized: true, | ||
virtualization: { | ||
maxListboxHeight: 600, | ||
itemHeight: 20, | ||
}, | ||
}, | ||
}; | ||
|
||
export const CustomItemHeight = { | ||
render: LargeDatasetTemplate, | ||
args: { | ||
...defaultProps, | ||
numItems: 1000, | ||
isVirtualized: true, | ||
virtualization: { | ||
itemHeight: 40, | ||
maxListboxHeight: 600, | ||
}, | ||
}, | ||
}; |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add input validation and improve memory efficiency
The
generateItems
function could benefit from several improvements:n
parameterConsider this improved implementation: