Extracted from https://github.com/facebook/react/issues/12643.

We're currently diff a host node in the complete phase even if it has bailed out in the begin phase. By itself, this just means we're doing a little bit more work than necessary. But it also has some observable effects. In particular, https://github.com/facebook/react/issues/13424 (which by itself would be very rare and probably not worth fixing) is made worse because we end up committing update to inputs from another component.

I have a fix for this in https://github.com/facebook/react/pull/13423. Filing this for posterity.
render() {
        return <div>Foo</div>;
      }
    }
    const element = <Foo />;
    
    let called = false;
    ReactDOM.render(element, container, () => (called = true));
    expect(called).toEqual(true);
    
    called = false;
    ReactDOM.unstable_batchedUpdates(() => {
      ReactDOM.render(element, container, () => (called = true));
    });
    expect(called).toEqual(true);
  });
  it('should render a component returning strings directly from render', () => {
    const Text = ({value}) => value;
    ReactDOM.render(<Text value="foo" />, container);
    expect(container.textContent).toEqual('foo');
  });
  it('should render a component returning numbers directly from render', () => {
    const Text = ({value}) => value;
    ReactDOM.render(<Text value={10} />, container);
    expect(container.textContent).toEqual('10');
  });
  it('finds the DOM Text node of a string child', () => {
    class Text extends React.Component {