css React onClick在第一次点击时不触发,第二次点击按预期行为(简单的调试消息直到第二次点击才出现)

oewdyzsn  于 2023-04-13  发布在  React
关注(0)|答案(4)|浏览(248)

我在某个时候引入了一个错误(实时版本没有这个问题),但还没有能够找出是什么导致它。
我在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.logonMouseEnter,它肯定是在我第一次点击时触发的,而不是在随后的点击。
编辑二:
但是这个mouseEnter的事情只发生在Firefox中,而不是Chrome。但是第一次点击不起作用的bug在两个浏览器中都有。
编辑3:
onMouseDown可以正常触发,但是onClick仍然只在第二次单击按钮时发生(此时onMouseDown已经触发了两次)。
另外,仔细检查并确认我没有在任何地方使用stopPropagation,这似乎是这个问题的常见来源。

qoefvg9y

qoefvg9y1#

想明白了!
在另一个相邻的div中,我有一个onBlur处理程序。在该处理程序中,我在组件上调用setState()(当div未聚焦时隐藏另一个div)。
为了显示有问题的按钮,我用onBlur点击了div中的一些东西。这给了它焦点。当我第一次点击出现的按钮时,它触发了blur
显然,setState()调用以某种方式干扰了点击,包括导致我描述的mouseEnter被重新触发的奇怪行为。也许setState导致了重绘,然后导致mouseEnter再次被触发?也许快速重绘也阻止了onClick的通过,即使mouseDown被触发了?(与事件排序有关?)我仍然不确定为什么会发生这种情况。
但是在删除setState()调用之后,第一次点击按钮就像预期的那样工作了。
这样就结束了几个小时痛苦的调试。

hkmswyz6

hkmswyz62#

我遇到了同样的问题,在你的onClick函数中,你必须坚持你的事件。

onClick={(e) => {
     e.persist();
     console.log("ONclicked! " + this.props.alt);
     // e.stopPropagation();
     // various callbacks
 }}>

有关此主题的更多解释,请参阅此链接:https://deepscan.io/docs/rules/react-missing-event-persist

b1payxdu

b1payxdu3#

如果您使用的是IntellijWebStorm,则在运行javascript debug模式时会发生这种情况。

laawzig2

laawzig24#

首先检查状态是否在第一次点击时更新,如果没有,请修复。
其次在onClick中添加persist事件,

onClick={(event) => {
 event.persist();
 console.log("ONclicked! " + this.props.alt);

}}

相关问题