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>
添加回答
举报
