javascript - React onClick 没有在第一次点击时触发,第二次点击按预期运行(简单的调试消息直到第二次点击才出现)

标签 javascript html css reactjs

我在某个时候引入了一个错误(实时版本没有这个问题)但一直无法弄清楚是什么导致了它。

我在 React 中有一个按钮(它只是一个带有 onClickdiv)。

该按钮具有 onClick:hover CSS 效果。

通过点击另一个 div 加载按钮(在第一次点击时起作用)。

加载按钮(及其包装内容)后,按钮在第一次点击时不执行任何操作。不做任何其他事情,再次点击让它正常工作。

目前我的 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 它肯定会在我第一次点击时触发,而不是在后续点击时触发。

编辑 2:

但是这个 mouseEnter 的事情只发生在 Firefox 中,而不是 Chrome。但是第一次点击不起作用的错误在两种浏览器中都存在。

编辑 3:

onMouseDown 正确触发,但 onClick 仍然仅在第二次单击按钮时发生(此时 onMouseDown 已触发两次).

此外,仔细检查并确认我没有在任何地方使用 stopPropagation,这似乎是此问题的常见来源。

最佳答案

想通了!

在另一个相邻的 div 中,我有一个 onBlur 处理程序。在该处理程序中,我在组件上调用了 setState()(当 div 未聚焦时隐藏另一个 div)。

为了显示有问题的按钮,我用 onBlurdiv 中点击了一些东西。这给了它重点。当我第一次点击出现的按钮时,它触发了 blur

显然,setState() 调用以某种方式干扰了点击,包括导致我用 mouseEnter 描述的奇怪行为被重新触发。也许 setState 导致重绘,然后导致 mouseEnter 再次被触发?也许快速重绘也会阻止 onClick 通过,即使 mouseDown 已被触发? (与事件排序有关?)我仍然不确定为什么会这样。

但在删除 setState() 调用后,第一次单击按钮会按预期工作。

这样就结束了几个小时的痛苦调试。

关于javascript - React onClick 没有在第一次点击时触发,第二次点击按预期运行(简单的调试消息直到第二次点击才出现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58106099/

相关文章:

javascript - 为什么我的所有数字都是重叠的?

javascript - 添加需要 Liquid 变量的自定义 Javascript 作为应用程序到 Shopify 的正确方法

javascript - 在 v-for 循环中使用 ajax 更改值

javascript - jQuery 'Show More' 'Show Less' 代码问题

html - 动态更新的数据列表不会显示

html - 选择下拉列表不显示所选元素

html - Sibling Selector Hover 仅适用于 Chrome

html - 内容部分在滚动条上显示额外的白色间距

css - 在 css 中使用 starts with selector 是否有效?

javascript - 在事件类 css bootstrap 中添加背景图片