From 6164b489a7220c4148e248f05d7dd56ff448cd56 Mon Sep 17 00:00:00 2001 From: Reinier Hartog Date: Sun, 7 Jan 2018 19:35:50 +0100 Subject: [PATCH 1/2] Add test for un- and remounting children of Call --- .../src/__tests__/ReactCallReturn-test.js | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/packages/react-call-return/src/__tests__/ReactCallReturn-test.js b/packages/react-call-return/src/__tests__/ReactCallReturn-test.js index 45cd4dedc7a1..088108d338f3 100644 --- a/packages/react-call-return/src/__tests__/ReactCallReturn-test.js +++ b/packages/react-call-return/src/__tests__/ReactCallReturn-test.js @@ -255,4 +255,66 @@ describe('ReactCallReturn', () => { ReactNoop.flush(); expect(ReactNoop.getChildren()).toEqual([span(100), span(200), span(500)]); }); + + it('should unmount and remount children', () => { + let ops = []; + + class Call extends React.Component { + render() { + return ReactCallReturn.unstable_createCall( + this.props.children, + (p, returns) => returns, + {}, + ); + } + } + + class Return extends React.Component { + render() { + ops.push(`Return ${this.props.value}`); + return ReactCallReturn.unstable_createReturn(this.props.children); + } + + componentWillMount() { + ops.push(`Mount Return ${this.props.value}`); + } + + componentWillUnmount() { + ops.push(`Unmount Return ${this.props.value}`); + } + } + + ReactNoop.render( + + + + , + ); + ReactNoop.flush(); + + expect(ops).toEqual([ + 'Mount Return 1', + 'Return 1', + 'Mount Return 2', + 'Return 2', + ]); + + ops = []; + + ReactNoop.render(); + ReactNoop.flush(); + + expect(ops).toEqual(['Unmount Return 1', 'Unmount Return 2']); + + ops = []; + + ReactNoop.render( + + + , + ); + ReactNoop.flush(); + + expect(ops).toEqual(['Mount Return 3', 'Return 3']); + }); }); From f20014d0ce9de95e70435f76dd6bf00517c11bfe Mon Sep 17 00:00:00 2001 From: Reinier Hartog Date: Sat, 6 Jan 2018 17:41:37 +0100 Subject: [PATCH 2/2] Reconcile Call component children with `current` --- packages/react-reconciler/src/ReactFiberBeginWork.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 42f53a28a0a5..6c962576e02e 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -559,7 +559,7 @@ export default function( } else { workInProgress.stateNode = reconcileChildFibers( workInProgress, - workInProgress.stateNode, + current.stateNode, nextChildren, renderExpirationTime, );