既然你的要求是控制每一个
Panel
单独地,然后一次只能打开其中一个(根据您的示例),那么您的状态必须存储打开的面板,而不是布尔值。既然你不想用
map
,为了避免更多的重复,您应该考虑移动
classNames
进入
面板
组件。
export default function Accordion() {
const [activePanel, setActivePanel] = useState(null);
const handleClick = (panelId) => {
setActivePanel((prevActivePanel) => (
prevActivePanel === panelId ? null : panelId
));
};
return (
<div className="accordion">
<Panel
isActive={activePanel === 1}
onClick={() => handleCLick(1)}
>
<h6>Panel One</h6>
<p>Lorem Ipsum Dolor Sit Amet</p>
</Panel>
<Panel
isActive={activePanel === 2}
onClick={() => handleClick(2)}
>
<h6>Panel Two</h6>
<p>Lorem Ipsum Dolor Sit Amet</p>
</Panel>
<Panel
isActive={activePanel === 3}
onClick={() => handleClick(3)}
>
<h6>Panel Three</h6>
<p>Lorem Ipsum Dolor Sit Amet</p>
</Panel>
</div>
);
}
function Panel({ children, isActive, onClick }) {
const classNames = 'panel ' + (isActive ? 'active' : '');
return (
<div className={className} onClick={onClick}>
{children}
</div>
);
}