【发布时间】:2021-03-24 15:18:45
【问题描述】:
我有以下组件
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>
在我的 PC 上,当鼠标悬停在 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
打开我的ListItemchildren。如果我第三次点击ListItem,我会控制台日志
onClick a
isActive false
关闭我的ListItem children
我如何解开我的状态变化,以便在我第一次而不是第二次点击时,我的ListItemchildren 在移动设备上打开?
【问题讨论】:
标签: javascript reactjs