Skip to content

Commit

Permalink
Inject default batching after pending transactions (#7033)
Browse files Browse the repository at this point in the history
(cherry picked from commit b6e1eb2)
  • Loading branch information
aweary authored and zpao committed Jul 13, 2016
1 parent 86cc1d4 commit 7d3cf95
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/renderers/dom/server/ReactServerRendering.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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(
Expand All @@ -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
);
}
}
}

Expand Down
31 changes: 31 additions & 0 deletions src/renderers/dom/server/__tests__/ReactServerRendering-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(
<div>
<img src="foo-bar.jpg" />
</div>
);
return <div dangerouslySetInnerHTML={{__html: staticContent}} />;
},
});

var Component = React.createClass({
componentWillMount: function() {
this.setState({text: 'hello, world'});
},
render: function() {
return <div>{this.state.text}</div>;
},
});
expect(
ReactServerRendering.renderToString.bind(
ReactServerRendering,
<div>
<StaticComponent />
<Component />
</div>
)
).not.toThrow();
});
});

it('warns with a no-op when an async setState is triggered', function() {
Expand Down

0 comments on commit 7d3cf95

Please sign in to comment.