I have the following component
const ListItem = ({ children, title = '' }) => {
const [isActive, setIsActive] = useState(false)
useEffect(() => {
console.log('isActive', isActive)
}, [isActive])
return (
<li className={`depth1${(isActive ? ' is-active' : '')}`} onMouseEnter={() => {
console.log('onMouseEnter')
setIsActive(true)
}} onMouseLeave={() => {
console.log('onMouseLeave')
setIsActive(false)
}}>
<a href="#" onClick={(e) => {
console.log('onClick a')
e.preventDefault()
setIsActive(!isActive)
}}>{title}</a>
{isActive && (
<ul onClick={() => {
console.log('onClick ul')
setIsActive(!isActive)
}}>
{children}
</ul>
)}
</li>
)
}
The component is used in the following context
<ul>
<ListItem title="BRAND">
<li>
<a href="#" onClick={(e) => {
e.preventDefault()
}}>Link</a>
</li>
<li>
<a href="#" onClick={(e) => {
e.preventDefault()
}}>Link</a>
</li>
<li>
<a href="#" onClick={(e) => {
e.preventDefault()
}}>Link</a>
</li>
</ListItem>
<ListItem title="SERVICE">
<li>
<a href="#" onClick={(e) => {
e.preventDefault()
}}>Link</a>
</li>
<li>
<a href="#" onClick={(e) => {
e.preventDefault()
}}>Link</a>
</li>
</ListItem>
<ListItem title="CLIENT">
<li>
<a href="#" onClick={(e) => {
e.preventDefault()
}}>Link</a>
</li>
</ListItem>
<ListItem title="CONTENTS">
<li>
<a href="#" onClick={(e) => {
e.preventDefault()
}}>Link</a>
</li>
</ListItem>
</ul>
On my PC when the mouse hovers over a ListItem, onMouseEnter activates and console logs
onMouseEnter
isActive true
On my PC when the mouse leaves a ListItem, onMouseLeave activates and console logs
onMouseLeave
isActive false
Everything here works fine. The problem is on mobile when I open my navigation menu, I console log
isActive false
as expected.
But when I click a ListItem for the first time, I console log
onMouseEnter
isActive true
onClick a
isActive false
and my ListItem children do not open. But when I clicked the ListItem the second time I console log
onClick a
isActive true
which opens my ListItem children. If I click the ListItem the third time, I console log
onClick a
isActive false
which closes my ListItem children
How do I untangle my state changes so that on my first and not second click, my ListItem children open on mobile?