From b31d26f85cf9c2e9e08bc322ebfab105c78a8bcc Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 24 Apr 2019 00:19:54 +0100 Subject: [PATCH] Experimental Event API: add event component mount phase callback --- .../src/events/DOMEventResponderSystem.js | 13 +++++++++ .../DOMEventResponderSystem-test.internal.js | 29 ++++++++++++++++++- .../src/ReactFiberCommitWork.js | 9 +++++- .../src/ReactFiberCompleteWork.js | 4 +-- packages/shared/ReactTypes.js | 6 +++- 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/packages/react-dom/src/events/DOMEventResponderSystem.js b/packages/react-dom/src/events/DOMEventResponderSystem.js index a1898b332d6..b7c790a0a7d 100644 --- a/packages/react-dom/src/events/DOMEventResponderSystem.js +++ b/packages/react-dom/src/events/DOMEventResponderSystem.js @@ -626,6 +626,19 @@ export function mountEventResponder( if (responder.onOwnershipChange !== undefined) { ownershipChangeListeners.add(eventComponentInstance); } + const onMount = responder.onMount; + if (onMount !== undefined) { + let {props, state} = eventComponentInstance; + currentEventQueue = createEventQueue(); + currentInstance = eventComponentInstance; + try { + onMount(eventResponderContext, props, state); + } finally { + currentEventQueue = null; + currentInstance = null; + currentTimers = null; + } + } } export function unmountEventResponder( diff --git a/packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js b/packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js index 7a6b51bb8ca..98e616b4a96 100644 --- a/packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js +++ b/packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js @@ -18,6 +18,7 @@ function createReactEventComponent( targetEventTypes, createInitialState, onEvent, + onMount, onUnmount, onOwnershipChange, ) { @@ -25,6 +26,7 @@ function createReactEventComponent( targetEventTypes, createInitialState, onEvent, + onMount, onUnmount, onOwnershipChange, }; @@ -559,12 +561,35 @@ describe('DOMEventResponderSystem', () => { ]); }); + it('the event responder onMount() function should fire', () => { + let onMountFired = 0; + + const EventComponent = createReactEventComponent( + [], + undefined, + undefined, + () => { + onMountFired++; + }, + ); + + const Test = () => ( + +