diff --git a/src/renderers/shared/fiber/ReactFiberScheduler.js b/src/renderers/shared/fiber/ReactFiberScheduler.js index d861c81cd1..4c7b0c5154 100644 --- a/src/renderers/shared/fiber/ReactFiberScheduler.js +++ b/src/renderers/shared/fiber/ReactFiberScheduler.js @@ -555,6 +555,8 @@ module.exports = function(config : HostConfig) { }); } + ReactCurrentOwner.current = null; + // Surface the first error uncaught by the boundaries to the user. if (firstUncaughtError) { // We need to make sure any future root can get scheduled despite these errors. diff --git a/src/renderers/shared/stack/reconciler/__tests__/ReactComponent-test.js b/src/renderers/shared/stack/reconciler/__tests__/ReactComponent-test.js index 769b2bafcc..6043979b0c 100644 --- a/src/renderers/shared/stack/reconciler/__tests__/ReactComponent-test.js +++ b/src/renderers/shared/stack/reconciler/__tests__/ReactComponent-test.js @@ -13,12 +13,14 @@ var React; var ReactDOM; +var ReactDOMFeatureFlags; var ReactTestUtils; describe('ReactComponent', () => { beforeEach(() => { React = require('React'); ReactDOM = require('ReactDOM'); + ReactDOMFeatureFlags = require('ReactDOMFeatureFlags'); ReactTestUtils = require('ReactTestUtils'); }); @@ -195,7 +197,7 @@ describe('ReactComponent', () => { getInner = () => { // (With old-style refs, it's impossible to get a ref to this div // because Wrapper is the current owner when this function is called.) - return
this.innerRef = c} />; + return
this.innerRef = c} />; }; render() { @@ -211,7 +213,7 @@ describe('ReactComponent', () => { componentDidMount() { // Check .props.title to make sure we got the right elements back expect(this.wrapperRef.getTitle()).toBe('wrapper'); - expect(ReactDOM.findDOMNode(this.innerRef).title).toBe('inner'); + expect(ReactDOM.findDOMNode(this.innerRef).className).toBe('inner'); mounted = true; } } @@ -291,10 +293,19 @@ describe('ReactComponent', () => { 'outer componentDidMount', 'start update', // Previous (equivalent) refs get cleared - 'ref 1 got null', - 'inner 1 render', - 'ref 2 got null', - 'inner 2 render', + ...(ReactDOMFeatureFlags.useFiber ? [ + // Fiber renders first, resets refs later + 'inner 1 render', + 'inner 2 render', + 'ref 1 got null', + 'ref 2 got null', + ] : [ + // Stack resets refs before rendering + 'ref 1 got null', + 'inner 1 render', + 'ref 2 got null', + 'inner 2 render', + ]), 'inner 1 componentDidUpdate', 'ref 1 got instance 1', 'inner 2 componentDidUpdate', diff --git a/src/renderers/shared/stack/reconciler/__tests__/refs-destruction-test.js b/src/renderers/shared/stack/reconciler/__tests__/refs-destruction-test.js index 1fdc948a27..b75b25c8bc 100644 --- a/src/renderers/shared/stack/reconciler/__tests__/refs-destruction-test.js +++ b/src/renderers/shared/stack/reconciler/__tests__/refs-destruction-test.js @@ -45,9 +45,17 @@ describe('refs-destruction', () => { var testInstance = ReactDOM.render(, container); expect(ReactTestUtils.isDOMComponent(testInstance.refs.theInnerDiv)) .toBe(true); - expect(Object.keys(testInstance.refs || {}).length).toEqual(1); + expect( + Object.keys(testInstance.refs || {}) + .filter(key => testInstance.refs[key]) + .length + ).toEqual(1); ReactDOM.unmountComponentAtNode(container); - expect(Object.keys(testInstance.refs || {}).length).toEqual(0); + expect( + Object.keys(testInstance.refs || {}) + .filter(key => testInstance.refs[key]) + .length + ).toEqual(0); }); it('should remove refs when destroying the child', () => { @@ -55,9 +63,17 @@ describe('refs-destruction', () => { var testInstance = ReactDOM.render(, container); expect(ReactTestUtils.isDOMComponent(testInstance.refs.theInnerDiv)) .toBe(true); - expect(Object.keys(testInstance.refs || {}).length).toEqual(1); + expect( + Object.keys(testInstance.refs || {}) + .filter(key => testInstance.refs[key]) + .length + ).toEqual(1); ReactDOM.render(, container); - expect(Object.keys(testInstance.refs || {}).length).toEqual(0); + expect( + Object.keys(testInstance.refs || {}) + .filter(key => testInstance.refs[key]) + .length + ).toEqual(0); }); it('should not error when destroying child with ref asynchronously', () => {