@@ -669,6 +669,76 @@ describe('ReactHooks', () => {
669
669
} ) . toThrow ( 'is not a function' ) ;
670
670
} ) ;
671
671
672
+ it ( 'does not forget render phase useState updates inside an effect' , ( ) => {
673
+ const { useState, useEffect} = React ;
674
+
675
+ function Counter ( ) {
676
+ const [ counter , setCounter ] = useState ( 0 ) ;
677
+ if ( counter === 0 ) {
678
+ setCounter ( x => x + 1 ) ;
679
+ setCounter ( x => x + 1 ) ;
680
+ }
681
+ useEffect ( ( ) => {
682
+ setCounter ( x => x + 1 ) ;
683
+ setCounter ( x => x + 1 ) ;
684
+ } , [ ] ) ;
685
+ return counter ;
686
+ }
687
+
688
+ const root = ReactTestRenderer . create ( null ) ;
689
+ ReactTestRenderer . act ( ( ) => {
690
+ root . update ( < Counter /> ) ;
691
+ } ) ;
692
+ expect ( root ) . toMatchRenderedOutput ( '4' ) ;
693
+ } ) ;
694
+
695
+ it ( 'does not forget render phase useReducer updates inside an effect with hoisted reducer' , ( ) => {
696
+ const { useReducer, useEffect} = React ;
697
+
698
+ const reducer = x => x + 1 ;
699
+ function Counter ( ) {
700
+ const [ counter , increment ] = useReducer ( reducer , 0 ) ;
701
+ if ( counter === 0 ) {
702
+ increment ( ) ;
703
+ increment ( ) ;
704
+ }
705
+ useEffect ( ( ) => {
706
+ increment ( ) ;
707
+ increment ( ) ;
708
+ } , [ ] ) ;
709
+ return counter ;
710
+ }
711
+
712
+ const root = ReactTestRenderer . create ( null ) ;
713
+ ReactTestRenderer . act ( ( ) => {
714
+ root . update ( < Counter /> ) ;
715
+ } ) ;
716
+ expect ( root ) . toMatchRenderedOutput ( '4' ) ;
717
+ } ) ;
718
+
719
+ it ( 'does not forget render phase useReducer updates inside an effect with inline reducer' , ( ) => {
720
+ const { useReducer, useEffect} = React ;
721
+
722
+ function Counter ( ) {
723
+ const [ counter , increment ] = useReducer ( x => x + 1 , 0 ) ;
724
+ if ( counter === 0 ) {
725
+ increment ( ) ;
726
+ increment ( ) ;
727
+ }
728
+ useEffect ( ( ) => {
729
+ increment ( ) ;
730
+ increment ( ) ;
731
+ } , [ ] ) ;
732
+ return counter ;
733
+ }
734
+
735
+ const root = ReactTestRenderer . create ( null ) ;
736
+ ReactTestRenderer . act ( ( ) => {
737
+ root . update ( < Counter /> ) ;
738
+ } ) ;
739
+ expect ( root ) . toMatchRenderedOutput ( '4' ) ;
740
+ } ) ;
741
+
672
742
it ( 'warns for bad useImperativeHandle first arg' , ( ) => {
673
743
const { useImperativeHandle} = React ;
674
744
function App ( ) {
0 commit comments