From 122660b09e6f420f78a9e47c9c5530b256424a27 Mon Sep 17 00:00:00 2001 From: Nick Grosenbacher Date: Thu, 29 Aug 2024 17:05:13 -0400 Subject: [PATCH] SWC-7038 - React component render should also be scheduled --- .../web/client/widget/ReactComponent.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/sagebionetworks/web/client/widget/ReactComponent.java b/src/main/java/org/sagebionetworks/web/client/widget/ReactComponent.java index 592448665a..88fdf77487 100644 --- a/src/main/java/org/sagebionetworks/web/client/widget/ReactComponent.java +++ b/src/main/java/org/sagebionetworks/web/client/widget/ReactComponent.java @@ -143,15 +143,22 @@ private void injectChildWidgetsIntoComponent() { public void render(ReactNode reactNode) { this.reactElement = reactNode; - maybeCreateRoot(); injectChildWidgetsIntoComponent(); // This component may be a React child of another component. If so, we must rerender the ancestor component(s) so // that they use the new ReactElement created in this render step. ReactComponent componentToRender = getRootReactComponentWidget(); if (componentToRender == this) { - // Resynchronize with the DOM - root.render(this.reactElement); + // Asynchronously schedule creating a root in case React is still rendering and may unmount the current root + Timer t = new Timer() { + @Override + public void run() { + maybeCreateRoot(); + // Resynchronize with the DOM + root.render(reactElement); + } + }; + t.schedule(0); } else { // Walk up the tree to the parent and repeat rerendering componentToRender.rerender();