我有以下组件
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>
)
}
该组件用于以下场景。
<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>
在我的电脑上,当鼠标悬停在一个
ListItem
上时,会触发 onMouseEnter
并在控制台中记录日志。onMouseEnter
isActive true
在我的电脑上,当鼠标离开一个
ListItem
时,onMouseLeave
就会被触发并在控制台中记录日志。onMouseLeave
isActive false
这里所有的东西都运行正常。问题出现在移动设备上,当我打开导航菜单时,我会在控制台中记录日志。
isActive false
正如预期。
但是当我第一次点击ListItem
时,我会在控制台打印日志
onMouseEnter
isActive true
onClick a
isActive false
我的 ListItem
的 children
没有打开。但当我第二次点击 ListItem
时,控制台记录了日志。
onClick a
isActive true
当我第三次点击 ListItem
时,它将打开我的 ListItem
children
。 我会在控制台上记录日志。
onClick a
isActive false
这会关闭我的 ListItem
的 children
我如何解决状态变化的混乱,以便在移动设备上第一次而不是第二次点击时打开我的 ListItem
的 children
?