小编典典

为什么未在dispatchEvent上调用React事件处理程序?

reactjs

考虑一下React组件中的以下输入元素:

<input onChange={() => console.log('onChange')} ... />

在测试React组件时,我正在模拟用户更改输入值:

input.value = newValue;
TestUtils.Simulate.change(input);

'onChange'如预期的那样,这导致被记录。

但是,当'change'事件直接分派时(我正在使用jsdom):

input.value = newValue;
input.dispatchEvent(new Event('change'));

onChange处理器不叫。

为什么?

我使用dispatchEvent而不是的动机TestUtils.Simulate是因为TestUtils.Simulate它不支持事件冒泡,而我组件的行为依赖于此。我想知道是否有没有方法可以测试事件TestUtils.Simulate


阅读 437

收藏
2020-07-22

共1个答案

小编典典

React使用其自己的事件系统SyntheticEvents(以防止浏览器不兼容,并为React 提供更多事件控制)。

TestUtils正确使用会创建这样的事件,它将触发您的onChange侦听器。

dispatchEvent另一方面,该函数将创建一个“本地”浏览器事件。但是您拥有的事件处理程序是由react管理的,因此只有react(badumts)可以对react进行响应SyntheticEvents

您可以在此处阅读反应事件:https :
//facebook.github.io/react/docs/events.html

2020-07-22