From 7d3cf9565ea3bb10b6f48a97afbf9a0a7faa410c Mon Sep 17 00:00:00 2001 From: Brandon Dail Date: Fri, 8 Jul 2016 12:52:14 -0500 Subject: [PATCH] Inject default batching after pending transactions (#7033) (cherry picked from commit b6e1eb27185dd90e74ad8a67f98f6c5b35043c1a) --- .../dom/server/ReactServerRendering.js | 11 ++++++- .../__tests__/ReactServerRendering-test.js | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/renderers/dom/server/ReactServerRendering.js b/src/renderers/dom/server/ReactServerRendering.js index e72c1ccbfc..fefb9af9d5 100644 --- a/src/renderers/dom/server/ReactServerRendering.js +++ b/src/renderers/dom/server/ReactServerRendering.js @@ -25,6 +25,8 @@ var emptyObject = require('emptyObject'); var instantiateReactComponent = require('instantiateReactComponent'); var invariant = require('invariant'); +var pendingTransactions = 0; + /** * @param {ReactElement} element * @return {string} the HTML markup @@ -36,6 +38,8 @@ function renderToStringImpl(element, makeStaticMarkup) { transaction = ReactServerRenderingTransaction.getPooled(makeStaticMarkup); + pendingTransactions++; + return transaction.perform(function() { var componentInstance = instantiateReactComponent(element, true); var markup = ReactReconciler.mountComponent( @@ -56,10 +60,15 @@ function renderToStringImpl(element, makeStaticMarkup) { return markup; }, null); } finally { + pendingTransactions--; ReactServerRenderingTransaction.release(transaction); // Revert to the DOM batching strategy since these two renderers // currently share these stateful modules. - ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy); + if (!pendingTransactions) { + ReactUpdates.injection.injectBatchingStrategy( + ReactDefaultBatchingStrategy + ); + } } } diff --git a/src/renderers/dom/server/__tests__/ReactServerRendering-test.js b/src/renderers/dom/server/__tests__/ReactServerRendering-test.js index 8ee8f18551..cd5d30f7f6 100644 --- a/src/renderers/dom/server/__tests__/ReactServerRendering-test.js +++ b/src/renderers/dom/server/__tests__/ReactServerRendering-test.js @@ -399,6 +399,37 @@ describe('ReactServerRendering', function() { ); expect(markup.indexOf('hello, world') >= 0).toBe(true); }); + + it('renders components with different batching strategies', function() { + var StaticComponent = React.createClass({ + render: function() { + const staticContent = ReactServerRendering.renderToStaticMarkup( +
+ +
+ ); + return
; + }, + }); + + var Component = React.createClass({ + componentWillMount: function() { + this.setState({text: 'hello, world'}); + }, + render: function() { + return
{this.state.text}
; + }, + }); + expect( + ReactServerRendering.renderToString.bind( + ReactServerRendering, +
+ + +
+ ) + ).not.toThrow(); + }); }); it('warns with a no-op when an async setState is triggered', function() {