2 回答

TA貢獻1828條經驗 獲得超13個贊
使用Select組件,我們甚至可以通過一些更正來重現行為。但它對你不起作用。“選擇”組件不需要嵌套在子元素中的項。這樣,我們將永遠無法識別所選的元素。
或者,我們有自動完成組件。它可以更好地滿足您的需求。
關于您提供的示例,我們可以執行一些操作,但同樣,我們將無法維護所選項目的狀態。要實現與列表相同的行為,我們需要將相同的行為應用于 Menu 將呈現的列表。Select 將呈現一個繼承 List 的 Menu,因此我們可以通過 prop MenuListProps 屬性應用與列表示例相同的行為。
我已將修復程序應用于您的示例

TA貢獻1816條經驗 獲得超4個贊
我設法用粘性菜單項制作了一個Material-ui選擇的工作解決方案。
使用 MaterialUI MenuItem 而不是所有<li> <ul> <ListSubheader>
const [isOpen, setIsOpen] = useState(false);
const [value, setValue] = useState();
const onToggle = () => {
setIsOpen((prev) => !prev);
};
const onClose = () => {
setIsOpen(false);
};
const _onChange = (event: React.ChangeEvent<{ value: unknown }>) => {
const valueToSelect = event.target.value as Value;
if (
isResetSeletced(valueToSelect) ||
(multiple
? !valueToSelect.length ||
valueToSelect.length < minSelections ||
(valueToSelect as string[]).some((option) => !option)
: !valueToSelect?.length && minSelections > 0)
) {
return;
}
event.persist();
onChange(valueToSelect);
};
const renderValue = (selected: any) => {
if (!selected.length) {
return '';
}
if (multiple) {
const isReachedLimit = selected.length > MAX_SELECTIONS;
const hiddenTags = isReachedLimit ? (
<span>+{value.length - MAX_SELECTIONS}</span>
) : null;
const selectionsToShow = isReachedLimit
? selected.slice(0, MAX_SELECTIONS)
: selected;
return (
<StyledTagsContainer>
<Tags values={selectionsToShow} onRemoveTag={onRemoveTag} />
{hiddenTags}
</StyledTagsContainer>
);
}
return selected;
};
const resetMenuItem = secondaryOptions?.map((resetItem, index) => {
return (
<MenuItem
key={resetItem.value + index}
onClick={() => {
resetItem.onClick();
}}
isLast={!index}
isSelected={
resetItem.value === resetSelected?.value ||
resetItem.value === value ||
(multiple && resetItem.value === value[0])
}
value={resetItem.value}
icon={<RadioIcon />}
>
{resetItem.text}
</MenuItem>
);
});
<Select
displayEmpty
onClose={onClose}
value={value}
onChange={_onChange}
renderValue={renderValue}
open={isOpen}
>
{menuItems}
<div style={{ position: 'sticky', bottom: 0 }}>
{resetMenuItem}
</div>
</Select>
添加回答
舉報