diff --git a/packages/react-dom/src/events/EnterLeaveEventPlugin.js b/packages/react-dom/src/events/EnterLeaveEventPlugin.js
index f8c8d279db005..300772410c603 100644
--- a/packages/react-dom/src/events/EnterLeaveEventPlugin.js
+++ b/packages/react-dom/src/events/EnterLeaveEventPlugin.js
@@ -42,6 +42,12 @@ const eventTypes = {
},
};
+// We track the lastNativeEvent to ensure that when we encounter
+// cases where we process the same nativeEvent multiple times,
+// which can happen when have multiple ancestors, that we don't
+// duplicate enter
+let lastNativeEvent;
+
const EnterLeaveEventPlugin = {
eventTypes: eventTypes,
@@ -163,9 +169,11 @@ const EnterLeaveEventPlugin = {
accumulateEnterLeaveDispatches(leave, enter, from, to);
- if (isOutEvent && from && nativeEventTarget !== fromNode) {
+ if (nativeEvent === lastNativeEvent) {
+ lastNativeEvent = null;
return [leave];
}
+ lastNativeEvent = nativeEvent;
return [leave, enter];
},
diff --git a/packages/react-dom/src/events/__tests__/EnterLeaveEventPlugin-test.js b/packages/react-dom/src/events/__tests__/EnterLeaveEventPlugin-test.js
index b8bda1c67fe9f..e91eb737914cc 100644
--- a/packages/react-dom/src/events/__tests__/EnterLeaveEventPlugin-test.js
+++ b/packages/react-dom/src/events/__tests__/EnterLeaveEventPlugin-test.js
@@ -185,4 +185,55 @@ describe('EnterLeaveEventPlugin', () => {
ReactDOM.render(