我在某个时候引入了一个错误(实时版本没有这个问题),但还没有能够找出是什么导致它。
我在React中有一个按钮(它只是一个div
和一个onClick
)。
该按钮具有onClick
和:hover
CSS效果。
通过单击另一个div
(第一次单击时有效)加载按钮。
加载按钮(及其 Package 内容)后,按钮在第一次单击时不做任何事情。不做任何其他事情,再次单击让它正常工作。
目前,我的onClick
中有一条调试消息,所以它看起来像这样
onClick={(e) => {
console.log("ONclicked! " + this.props.alt);
// e.stopPropagation();
// various callbacks
}}>
我在所有按钮的父元素上也有类似的console.log
调试消息,* 一直到根React元素 (即单击页面上的任何位置都会弹出一条消息,除了第一次单击这个特定按钮时)。即使是根元素也不会在第一次单击时注册任何内容。
第一次单击时不会显示这些消息。
同样, 不做任何其他事情 *,只需在同一位置再次单击,就会像预期的那样触发onClick
。
其他关于“第一次点击不起作用”的问题我看到的都是关于第一次点击时状态不更新的问题。在我的情况下,我甚至没有尝试更新状态,我似乎根本没有得到onClick
调用。
我已经查看了这个版本的所有提交,但仍然无法找出问题所在。有什么想法可以导致这种行为吗?对我来说最奇怪的部分是第二次点击有效,而第一次似乎没有做任何事情。但是在第一次和第二次点击之间,状态/DOM没有任何变化(因为第一次点击似乎根本没有注册)。我想这排除了像错误配置的pointer-events
CSS规则之类的事情?
编辑:
经过进一步的探索,似乎第一次点击实际上触发了onMouseEnter
,这似乎完全疯了哈哈...但我添加了一个console.log
到onMouseEnter
,它肯定是在我第一次点击时触发的,而不是在随后的点击。
编辑二:
但是这个mouseEnter的事情只发生在Firefox中,而不是Chrome。但是第一次点击不起作用的bug在两个浏览器中都有。
编辑3:onMouseDown
可以正常触发,但是onClick
仍然只在第二次单击按钮时发生(此时onMouseDown
已经触发了两次)。
另外,仔细检查并确认我没有在任何地方使用stopPropagation
,这似乎是这个问题的常见来源。
4条答案
按热度按时间qoefvg9y1#
想明白了!
在另一个相邻的div中,我有一个
onBlur
处理程序。在该处理程序中,我在组件上调用setState()
(当div
未聚焦时隐藏另一个div
)。为了显示有问题的按钮,我用
onBlur
点击了div
中的一些东西。这给了它焦点。当我第一次点击出现的按钮时,它触发了blur
。显然,
setState()
调用以某种方式干扰了点击,包括导致我描述的mouseEnter
被重新触发的奇怪行为。也许setState
导致了重绘,然后导致mouseEnter
再次被触发?也许快速重绘也阻止了onClick
的通过,即使mouseDown
被触发了?(与事件排序有关?)我仍然不确定为什么会发生这种情况。但是在删除
setState()
调用之后,第一次点击按钮就像预期的那样工作了。这样就结束了几个小时痛苦的调试。
hkmswyz62#
我遇到了同样的问题,在你的onClick函数中,你必须坚持你的事件。
有关此主题的更多解释,请参阅此链接:https://deepscan.io/docs/rules/react-missing-event-persist
b1payxdu3#
如果您使用的是
Intellij
或WebStorm
,则在运行javascript debug
模式时会发生这种情况。laawzig24#
首先检查状态是否在第一次点击时更新,如果没有,请修复。
其次在onClick中添加persist事件,
}}