3 回答
TA贡献1842条经验 获得超12个赞
您的问题是您正在设置一个本地状态来控制它是否应该打开,但然后检查单击项目的道具。
更改这一行:
// I removed props from props.itemClicked
<Menu.ItemIcon id={index} style={{ right: "0px", position: "absolute" }} className={itemClicked === index && item.children ? 'rotate' : ''}>
TA贡献1810条经验 获得超5个赞
您应该使用组件的状态来检查菜单项是否打开。另外,我删除了不必要的depth状态。希望这能有所帮助。
const StackedMenu = ({items, depth, ...otherProps}) => {
let [chevronRotation, setChevronRotation] = useState('');
let [itemClicked, setItemClicked] = useState(otherProps.itemClicked);
return (
<Menu
primary
defaultActiveIndex={0}
activeIndex={itemClicked}
vertical
pointing
style={{width: '100%'}}>
{items.map((item, index) => {
return (
<>
<MenuItem
onClick={(e, data) => {
setItemClicked(data.index);
setChevronRotation(`rotate`);
}}
index={index}
key={index}
pointing="start">
<Menu.ItemContent
style={depth > 0 ? {paddingLeft: '0.5em'} : null}>
{item.content}
</Menu.ItemContent>
{item.children ? (
<Menu.ItemIcon
id={index}
style={{right: '0px', position: 'absolute'}}
className={itemClicked === index ? 'rotate' : ''}>
<ChevronEndMediumIcon />
</Menu.ItemIcon>
) : null}
</MenuItem>
{itemClicked === index && item.children ? (
<div>
<StackedMenu
items={item.children}
depth={depth + 1}
itemClicked={0}
/>
</div>
) : null}
</>
);
})}
</Menu>
);
};
TA贡献1942条经验 获得超3个赞
使用“代码分割”。只需创建一个单独的组件并将状态放置在该组件内即可。这会为列表中的每个项目创建一个单独的状态,以便 onclick 仅遵循该项目。
<div>
<Mycomponent />
</div>
const Mycomponent = ()=>{
const [active, setactive] = useState(false);
return (
<div>
<div
key={i}
style={{
boxShadow: active
? "4px 3px 8px 0px rgba(1, 156, 48, 0.3)"
: "initial"
}}
onClick={() => setactive(!active)}
>
{message.content}
</div>
<div>
);
添加回答
举报