Reputation: 148
I am trying to create an admin panel and in which I have a sidebar menu. I have created a dropdown menu and it's working using the useState hook but not working as I wanted. What I wanted is when I click on Clients so if statement should only run for its children only not for all sibling children.
const [isActive, setIsActive] = useState(false);
const handleToggle = () => {
setIsActive(!isActive)
}
Below is the dropdown code.
<li>
<a className={`${isActive?'open-sibling':'hidden-sibling'} left-menu-list`} onClick={handleToggle}>
<i className="las la-user-alt mr-2"></i>
<span>Clients</span>
<i className="las la-angle-up ml-auto"></i>
</a>
<ul>
<Link href="/clients/list">
<li>
<a className="left-menu-list">
<i className="las la-users mr-2"></i> View All Clients
</a>
</li>
</Link>
</ul>
</li>
Please find the GIF of the output:-
Upvotes: 4
Views: 2059
Reputation: 12181
Here you go with a solution
const [isActive, setIsActive] = useState({
status: false,
key: ""
});
const handleToggle = (key) => {
if(isActive.key === key) {
setIsActive({
status: false,
key: ""
});
} else {
setIsActive({
status: true,
key
});
}
}
<li>
<a className={`${isActive.key == 'client' ? 'open-sibling':'hidden-sibling'} left-menu-list`} onClick={() => handleToggle("client")}>
<i className="las la-user-alt mr-2"></i>
<span>Clients</span>
<i className="las la-angle-up ml-auto"></i>
</a>
<ul>
<Link href="/clients/list">
<li>
<a className="left-menu-list">
<i className="las la-users mr-2"></i> View All Clients
</a>
</li>
</Link>
</ul>
</li>
Please use the status
and key
to view the children elements
Upvotes: 3
Reputation: 76
As per this comment,
This is the expected behaviour if same state is used for all dropdowns. See if you can use separate state for each menu. Like,
const [isClientActive, setIsClientActive] = useState(false);
const [isordersActive, setIsOrdersActive] = useState(false);
const handleClientToggle = () => {
setIsClientActive(!isClientActive)
}
const handleOrdersToggle = () => {
setIsOrdersActive(!isordersActive)
}
or use an object to store in one place
const [isActive, setIsActive] = useState({client: false, order:false});
Upvotes: 0