From e7beb99738821c3ad9226470b85027d66a02422c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B8=E5=BE=92=E6=AD=A3=E7=BE=8E?= <1669866773@qq.com> Date: Mon, 29 Apr 2019 15:58:01 +0800 Subject: [PATCH 1/6] Update ReactDOM.js rewrite legacyRenderSubtreeIntoContainer --- packages/react-dom/src/client/ReactDOM.js | 44 ++++++++--------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index 728f775adf5..fb7d6ef5c29 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -549,22 +549,27 @@ function legacyRenderSubtreeIntoContainer( // TODO: Without `any` type, Flow says "Property cannot be accessed on any // member of intersection type." Whyyyyyy. + let instance = null; let root: Root = (container._reactRootContainer: any); + let exec = function(cb){ + cb() + } if (!root) { // Initial mount root = container._reactRootContainer = legacyCreateRootFromDOMContainer( container, forceHydrate, ); - if (typeof callback === 'function') { - const originalCallback = callback; - callback = function() { - const instance = getPublicRootInstance(root._internalRoot); - originalCallback.call(instance); - }; - } - // Initial mount should not be batched. - unbatchedUpdates(() => { + exec = unbatchedUpdates; + } + if (typeof callback === 'function') { + const originalCallback = callback; + callback = function() { + instance = getPublicRootInstance(root._internalRoot); + originalCallback.call(instance); + }; + } + exec(() => { if (parentComponent != null) { root.legacy_renderSubtreeIntoContainer( parentComponent, @@ -575,26 +580,7 @@ function legacyRenderSubtreeIntoContainer( root.render(children, callback); } }); - } else { - if (typeof callback === 'function') { - const originalCallback = callback; - callback = function() { - const instance = getPublicRootInstance(root._internalRoot); - originalCallback.call(instance); - }; - } - // Update - if (parentComponent != null) { - root.legacy_renderSubtreeIntoContainer( - parentComponent, - children, - callback, - ); - } else { - root.render(children, callback); - } - } - return getPublicRootInstance(root._internalRoot); + return instance; } function createPortal( From 83f2f42912a3e832870a8b2d1446daa35cbf9377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B8=E5=BE=92=E6=AD=A3=E7=BE=8E?= <1669866773@qq.com> Date: Mon, 29 Apr 2019 16:06:59 +0800 Subject: [PATCH 2/6] Update ReactDOM.js --- packages/react-dom/src/client/ReactDOM.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index fb7d6ef5c29..07899e9e06e 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -562,22 +562,22 @@ function legacyRenderSubtreeIntoContainer( ); exec = unbatchedUpdates; } - if (typeof callback === 'function') { - const originalCallback = callback; - callback = function() { + function getInstance(){ instance = getPublicRootInstance(root._internalRoot); - originalCallback.call(instance); - }; + if (typeof callback === 'function') { + callback.call(instance); + } } + exec(() => { if (parentComponent != null) { root.legacy_renderSubtreeIntoContainer( parentComponent, children, - callback, + getInstance, ); } else { - root.render(children, callback); + root.render(children, getInstance); } }); return instance; From e5dbcbd619223ce5cb20e2d6e775db881ecff290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B8=E5=BE=92=E6=AD=A3=E7=BE=8E?= <1669866773@qq.com> Date: Sat, 4 May 2019 03:27:11 +0800 Subject: [PATCH 3/6] Update ReactDOM.js --- packages/react-dom/src/client/ReactDOM.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index 07899e9e06e..76c2680f3d0 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -549,7 +549,6 @@ function legacyRenderSubtreeIntoContainer( // TODO: Without `any` type, Flow says "Property cannot be accessed on any // member of intersection type." Whyyyyyy. - let instance = null; let root: Root = (container._reactRootContainer: any); let exec = function(cb){ cb() @@ -562,25 +561,20 @@ function legacyRenderSubtreeIntoContainer( ); exec = unbatchedUpdates; } - function getInstance(){ - instance = getPublicRootInstance(root._internalRoot); - if (typeof callback === 'function') { - callback.call(instance); - } - } + exec(() => { if (parentComponent != null) { root.legacy_renderSubtreeIntoContainer( parentComponent, children, - getInstance, + callback, ); } else { - root.render(children, getInstance); + root.render(children, callback); } }); - return instance; + return getPublicRootInstance(root._internalRoot) } function createPortal( From 16d42ed3960d448810ce12b03b7cafab053ec506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B8=E5=BE=92=E6=AD=A3=E7=BE=8E?= <1669866773@qq.com> Date: Sat, 4 May 2019 03:32:04 +0800 Subject: [PATCH 4/6] Update ReactDOM.js --- packages/react-dom/src/client/ReactDOM.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index 76c2680f3d0..428cb60e060 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -562,17 +562,12 @@ function legacyRenderSubtreeIntoContainer( exec = unbatchedUpdates; } - exec(() => { - if (parentComponent != null) { root.legacy_renderSubtreeIntoContainer( - parentComponent, + parentComponent || null, children, callback, ); - } else { - root.render(children, callback); - } }); return getPublicRootInstance(root._internalRoot) } From 8b456846deeeed544ca857c29d63283403f52c9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B8=E5=BE=92=E6=AD=A3=E7=BE=8E?= <1669866773@qq.com> Date: Sat, 4 May 2019 03:44:37 +0800 Subject: [PATCH 5/6] Update ReactDOM.js --- packages/react-dom/src/client/ReactDOM.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index 428cb60e060..b837f361ff7 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -553,6 +553,7 @@ function legacyRenderSubtreeIntoContainer( let exec = function(cb){ cb() } + let instance = null; if (!root) { // Initial mount root = container._reactRootContainer = legacyCreateRootFromDOMContainer( @@ -561,15 +562,24 @@ function legacyRenderSubtreeIntoContainer( ); exec = unbatchedUpdates; } + function getInstance(){ + if (__DEV__) { + warnOnInvalidCallback(callback, 'render'); + } + instance = getPublicRootInstance(root._internalRoot); + if (typeof callback === 'function') { + callback.call(instance); + } + } exec(() => { root.legacy_renderSubtreeIntoContainer( parentComponent || null, children, - callback, + getInstance, ); }); - return getPublicRootInstance(root._internalRoot) + return instance } function createPortal( From 665df1a8932546058bccd460f0f1c4ba93f401b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B8=E5=BE=92=E6=AD=A3=E7=BE=8E?= <1669866773@qq.com> Date: Sat, 4 May 2019 03:47:30 +0800 Subject: [PATCH 6/6] Update ReactDOM.js --- packages/react-dom/src/client/ReactDOM.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index b837f361ff7..35c39fb80fd 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -551,7 +551,7 @@ function legacyRenderSubtreeIntoContainer( // member of intersection type." Whyyyyyy. let root: Root = (container._reactRootContainer: any); let exec = function(cb){ - cb() + cb(); } let instance = null; if (!root) { @@ -562,7 +562,7 @@ function legacyRenderSubtreeIntoContainer( ); exec = unbatchedUpdates; } - function getInstance(){ + function getInstance(){ if (__DEV__) { warnOnInvalidCallback(callback, 'render'); } @@ -579,7 +579,7 @@ function legacyRenderSubtreeIntoContainer( getInstance, ); }); - return instance + return instance; } function createPortal(