- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下组件
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
children
.如果我点击
ListItem
第三次,我控制台日志
onClick a
isActive false
关闭我的
ListItem
children
如何解开我的状态变化,以便在我第一次而不是第二次点击时,我的
ListItem
children
在手机上打开?
最佳答案
这是一个令人惊讶的棘手问题。您可以尝试几种方法。我没有时间亲自尝试它们。
<li>
上使用 native 非冒泡事件(mouseenter、mouseleave)。元素。 useEvent 是一个更方便地使用原生事件的钩子(Hook)。 (只需复制代码,因为我还没有决定该库的 future )import React, { useState, useCallback } from 'react';
import classnames from 'classnames';
import { useEvent } from 'the/path/to/the/hook';
const useMouseEnter = (listener, options) => useEvent('mouseenter', listener, options);
const useMouseLeave = (listener, options) => useEvent('mouseleave', listener, options);
const ListItem = ({ children, title = '' }) => {
const [isActive, setIsActive] = useState(false);
const toggle = () => setIsActive(_ => !_);
const open = () => setIsActive(true);
const close = () => setIsActive(false);
const [setMouseEnterTarget] = useMouseEnter(open); // the setters are stable...
const [setMouseLeaveTarget] = useMouseLeave(close);
const setRef = useCallback((element) => {
setMouseEnterTarget(element);
setMouseLeaveTarget(element);
}, []); // ...so we don't need them in the dependencies array
return (
<li ref={setRef} className={classnames('depth1', { 'is-active': isActive })}>
<a href="#" onClick={(e) => {
console.log('onClick a');
e.preventDefault();
toggle();
}}>{title}</a>
hover
是您当前环境的一项功能,并相应地控制您的代码行为: const [isActive, setIsActive] = useState(false);
const toggle = () => setIsActive(_ => !_);
const open = () => setIsActive(true);
const close = () => setIsActive(false);
const supportsHover = useMedia('(hover: hover)');
const mouseEvents = {
onMouseEnter: open,
onMouseLeave: close,
};
return (
<li className={classnames('depth1', { 'is-active': isActive })}
{ ...supportsHover ? mouseEvents : undefined }
>
<a href="#" onClick={(e) => {
console.log('onClick a');
e.preventDefault();
toggle();
}}>{title}</a>
和钩子(Hook)
import { useState, useEffect } from 'react';
export const useMedia = (query) => {
const [matches, setMatches] = useState(window.matchMedia(query).matches);
useEffect(() => {
const media = window.matchMedia(query);
if (media.matches !== matches) setMatches(media.matches);
const listener = () => setMatches(media.matches);
media.addListener(listener);
return () => media.removeListener(listener);
}, [matches, query]);
return matches;
};
关于javascript - 解开 onMouseEnter、onMouseLeave 和 onClick 中的状态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66758341/
我有 2 张图片,一张和两张 悬停在one上时,显示two,隐藏one 然后,如果我点击two,它应该再次隐藏并显示one 到目前为止一切正常 但是,问题是,鼠标已经在 one 图像上,所以 onmo
在这里,我在 React 中使用 onMouseOver 事件,但它对我来说效果不佳。 我使用正确的方法来使用、调用和设置状态。这是我的代码,请大家帮忙。 import React from 'rea
如何让 JavaScript 触发 onMouseEnter -目标事件 -元素,而另一个拖动输入元素(按下鼠标按钮)? 由于多种原因,我无法使用 onDrag...事件... 示例:https://
我有这个代码片段,最初是由 Shomz 制作的(特别感谢)但最近解决方案在 Chrome 中乱七八糟(淡入淡出效果有时会跳过)- 在 v45.0.2454.99 m(64 位)和 v45.0.2454
我想在 Unity3D 上旋转一张扑克牌,所以当玩家点击卡片时,会显示卡片。 我阅读了文档,到目前为止,我能够使用以下代码完成此操作: public void OnMouseEnter() {
我正在寻找一种方法来重新路由 TPanel 的 OnMouseEnter 的事件处理程序。我有一个包含一系列 TPanels 的类,我用它们来表示座位表。我希望能够将自定义事件分配给在运行时动态创建的
我有以下片段(由@SpencerWieczorek 调整,谢谢): $('.parent').mouseenter(function(){ $('.child').fadeToggle(); })
当我直接在 html 中包含对该函数的引用时,我能够使 onmousesenter 正常工作,但读到它是错误的形式并且想改进我的代码 - 但现在我无法让它运行,尽管我显示它的代码确实触发了该功能,我只
我运行下面的代码:我返回一个 div 数组,我希望它们在鼠标输入(悬停)时更改背景。只有当我点击它时事件才会触发。这是因为我需要选择 div 吗?我已经尝试过 tab index = 0 和 tab
我知道这个问题人们问过很多次,但我没有找到任何答案让我有机会解决这个问题 { console.log('enter') }} onM
我正在尝试实现悬停时显示的菜单。问题是菜单在悬停在 DropdownOption 子元素之间时会隐藏,所以每当我在选项 1 和 2 之间悬停时。每个子元素都是一个 div,并且有 0px 的边距
如您所见,以下动画在您第一次将鼠标悬停在正方形上时会起作用,但在第一次后它不再起作用,这就是我的目标: function js1(x){ x.style.animation="anime 1s"; }
我正在将 onMouseEnter 事件分配给父元素,但子元素是被此事件触发的元素。当我在控制台上写 e.target 时,它会打印出 child 。我怎样才能防止这种行为? 我已经尝试了 e.sto
您好,请问是否有包含这 2 个鼠标事件的 VirtualStringTree 版本: OnMouseEnter 和 OnMouseLeave ? 最佳答案 如果您的字符串树尚不支持这些事件,那么添加这
我认为答案与“this”的上下文有关。当我尝试通过传递handleEnter()函数来渲染createTrack时,出现“无法读取未定义的属性”的错误。但是,我可以向它传递一个不带“this”的常规函
问题 我想在Windows 上的Delphi XE6中简化以下代码,随着我添加越来越多类型的组件,该代码变得难以维护。 可移植性说明:我想稍后在 Linux 上的 Lazarus 2.0.2 中使用相
我使用 antd 表格组件创建了一个表格。 const dataSource = [{ key: '1', value1: 4, value2:
我使用的是 Rad Studio XE3 附带的 TeeChart 版本。 TeeChart 提供了一个 TChartSeries 事件,当鼠标指针移动到系列线上时会触发该事件。我使用此事件在指针下显
我在div上使用hover()来在用户将鼠标移到上方时显示信息面板,这在90%的情况下有效,但有时事件似乎无法正确触发。这似乎与您将鼠标移入或移出 div 的速度有关。 我设置了一个 jsfiddle
我有一个呈现 reactstrap 表的组件,在呈现器中我有一个客户端状态的映射函数,该函数被呈现为表行。 在每个表行中都有一个组件(单独的按钮组件,只是打开一个模态)在 map 函数中呈现。我想使用
我是一名优秀的程序员,十分优秀!