@@ -77,10 +77,6 @@ type ComponentLifeCycle =
7777 */
7878 | 'UNMOUNTED' ;
7979
80- function getLifeCycleState ( instance ) : ComponentLifeCycle {
81- return instance . updater . isMounted ( instance ) ? 'MOUNTED' : 'UNMOUNTED' ;
82- }
83-
8480/**
8581 * TODO: We should make any setState calls fail in
8682 * `getInitialState` and `componentWillMount`. They will usually fail
@@ -290,137 +286,6 @@ describe('ReactComponentLifeCycle', () => {
290286 } ) ;
291287 } ) ;
292288
293- it ( 'should correctly determine if a component is mounted' , async ( ) => {
294- class Component extends React . Component {
295- _isMounted ( ) {
296- // No longer a public API, but we can test that it works internally by
297- // reaching into the updater.
298- return this . updater . isMounted ( this ) ;
299- }
300- UNSAFE_componentWillMount ( ) {
301- expect ( this . _isMounted ( ) ) . toBeFalsy ( ) ;
302- }
303- componentDidMount ( ) {
304- expect ( this . _isMounted ( ) ) . toBeTruthy ( ) ;
305- }
306- render ( ) {
307- expect ( this . _isMounted ( ) ) . toBeFalsy ( ) ;
308- return < div /> ;
309- }
310- }
311-
312- let instance ;
313- const element = < Component ref = { current => ( instance = current ) } /> ;
314-
315- const container = document . createElement ( 'div' ) ;
316- const root = ReactDOMClient . createRoot ( container ) ;
317- await act ( ( ) => {
318- root . render ( element ) ;
319- } ) ;
320- assertConsoleErrorDev ( [
321- 'Component is accessing isMounted inside its render() function. ' +
322- 'render() should be a pure function of props and state. ' +
323- 'It should never access something that requires stale data ' +
324- 'from the previous render, such as refs. ' +
325- 'Move this logic to componentDidMount and componentDidUpdate instead.\n' +
326- ' in Component (at **)' ,
327- ] ) ;
328- expect ( instance . _isMounted ( ) ) . toBeTruthy ( ) ;
329- } ) ;
330-
331- it ( 'should correctly determine if a null component is mounted' , async ( ) => {
332- class Component extends React . Component {
333- _isMounted ( ) {
334- // No longer a public API, but we can test that it works internally by
335- // reaching into the updater.
336- return this . updater . isMounted ( this ) ;
337- }
338- UNSAFE_componentWillMount ( ) {
339- expect ( this . _isMounted ( ) ) . toBeFalsy ( ) ;
340- }
341- componentDidMount ( ) {
342- expect ( this . _isMounted ( ) ) . toBeTruthy ( ) ;
343- }
344- render ( ) {
345- expect ( this . _isMounted ( ) ) . toBeFalsy ( ) ;
346- return null ;
347- }
348- }
349-
350- let instance ;
351- const element = < Component ref = { current => ( instance = current ) } /> ;
352-
353- const container = document . createElement ( 'div' ) ;
354- const root = ReactDOMClient . createRoot ( container ) ;
355- await act ( ( ) => {
356- root . render ( element ) ;
357- } ) ;
358- assertConsoleErrorDev ( [
359- 'Component is accessing isMounted inside its render() function. ' +
360- 'render() should be a pure function of props and state. ' +
361- 'It should never access something that requires stale data ' +
362- 'from the previous render, such as refs. ' +
363- 'Move this logic to componentDidMount and componentDidUpdate instead.\n' +
364- ' in Component (at **)' ,
365- ] ) ;
366- expect ( instance . _isMounted ( ) ) . toBeTruthy ( ) ;
367- } ) ;
368-
369- it ( 'isMounted should return false when unmounted' , async ( ) => {
370- class Component extends React . Component {
371- render ( ) {
372- return < div /> ;
373- }
374- }
375-
376- const root = ReactDOMClient . createRoot ( document . createElement ( 'div' ) ) ;
377- const instanceRef = React . createRef ( ) ;
378- await act ( ( ) => {
379- root . render ( < Component ref = { instanceRef } /> ) ;
380- } ) ;
381- const instance = instanceRef . current ;
382-
383- // No longer a public API, but we can test that it works internally by
384- // reaching into the updater.
385- expect ( instance . updater . isMounted ( instance ) ) . toBe ( true ) ;
386-
387- await act ( ( ) => {
388- root . unmount ( ) ;
389- } ) ;
390-
391- expect ( instance . updater . isMounted ( instance ) ) . toBe ( false ) ;
392- } ) ;
393-
394- // @gate www && classic
395- it ( 'warns if legacy findDOMNode is used inside render' , async ( ) => {
396- class Component extends React . Component {
397- state = { isMounted : false } ;
398- componentDidMount ( ) {
399- this . setState ( { isMounted : true } ) ;
400- }
401- render ( ) {
402- if ( this . state . isMounted ) {
403- expect ( ReactDOM . findDOMNode ( this ) . tagName ) . toBe ( 'DIV' ) ;
404- }
405- return < div /> ;
406- }
407- }
408-
409- const container = document . createElement ( 'div' ) ;
410- const root = ReactDOMClient . createRoot ( container ) ;
411- await act ( ( ) => {
412- root . render ( < Component /> ) ;
413- } ) ;
414- assertConsoleErrorDev ( [
415- 'Component is accessing findDOMNode inside its render(). ' +
416- 'render() should be a pure function of props and state. ' +
417- 'It should never access something that requires stale data ' +
418- 'from the previous render, such as refs. ' +
419- 'Move this logic to componentDidMount and componentDidUpdate instead.\n' +
420- ' in Component (at **)' ,
421- ] ) ;
422- } ) ;
423-
424289 it ( 'should carry through each of the phases of setup' , async ( ) => {
425290 class LifeCycleComponent extends React . Component {
426291 constructor ( props , context ) {
@@ -433,31 +298,25 @@ describe('ReactComponentLifeCycle', () => {
433298 hasWillUnmountCompleted : false ,
434299 } ;
435300 this . _testJournal . returnedFromGetInitialState = clone ( initState ) ;
436- this . _testJournal . lifeCycleAtStartOfGetInitialState =
437- getLifeCycleState ( this ) ;
438301 this . state = initState ;
439302 }
440303
441304 UNSAFE_componentWillMount ( ) {
442305 this . _testJournal . stateAtStartOfWillMount = clone ( this . state ) ;
443- this . _testJournal . lifeCycleAtStartOfWillMount = getLifeCycleState ( this ) ;
444306 this . state . hasWillMountCompleted = true ;
445307 }
446308
447309 componentDidMount ( ) {
448310 this . _testJournal . stateAtStartOfDidMount = clone ( this . state ) ;
449- this . _testJournal . lifeCycleAtStartOfDidMount = getLifeCycleState ( this ) ;
450311 this . setState ( { hasDidMountCompleted : true } ) ;
451312 }
452313
453314 render ( ) {
454315 const isInitialRender = ! this . state . hasRenderCompleted ;
455316 if ( isInitialRender ) {
456317 this . _testJournal . stateInInitialRender = clone ( this . state ) ;
457- this . _testJournal . lifeCycleInInitialRender = getLifeCycleState ( this ) ;
458318 } else {
459319 this . _testJournal . stateInLaterRender = clone ( this . state ) ;
460- this . _testJournal . lifeCycleInLaterRender = getLifeCycleState ( this ) ;
461320 }
462321 // you would *NEVER* do anything like this in real code!
463322 this . state . hasRenderCompleted = true ;
@@ -466,8 +325,6 @@ describe('ReactComponentLifeCycle', () => {
466325
467326 componentWillUnmount ( ) {
468327 this . _testJournal . stateAtStartOfWillUnmount = clone ( this . state ) ;
469- this . _testJournal . lifeCycleAtStartOfWillUnmount =
470- getLifeCycleState ( this ) ;
471328 this . state . hasWillUnmountCompleted = true ;
472329 }
473330 }
@@ -480,52 +337,33 @@ describe('ReactComponentLifeCycle', () => {
480337 await act ( ( ) => {
481338 root . render ( < LifeCycleComponent ref = { instanceRef } /> ) ;
482339 } ) ;
483- assertConsoleErrorDev ( [
484- 'LifeCycleComponent is accessing isMounted inside its render() function. ' +
485- 'render() should be a pure function of props and state. ' +
486- 'It should never access something that requires stale data ' +
487- 'from the previous render, such as refs. ' +
488- 'Move this logic to componentDidMount and componentDidUpdate instead.\n' +
489- ' in LifeCycleComponent (at **)' ,
490- ] ) ;
491340 const instance = instanceRef . current ;
492341
493342 // getInitialState
494343 expect ( instance . _testJournal . returnedFromGetInitialState ) . toEqual (
495344 GET_INIT_STATE_RETURN_VAL ,
496345 ) ;
497- expect ( instance . _testJournal . lifeCycleAtStartOfGetInitialState ) . toBe (
498- 'UNMOUNTED' ,
499- ) ;
500346
501347 // componentWillMount
502348 expect ( instance . _testJournal . stateAtStartOfWillMount ) . toEqual (
503349 instance . _testJournal . returnedFromGetInitialState ,
504350 ) ;
505- expect ( instance . _testJournal . lifeCycleAtStartOfWillMount ) . toBe ( 'UNMOUNTED' ) ;
506351
507352 // componentDidMount
508353 expect ( instance . _testJournal . stateAtStartOfDidMount ) . toEqual (
509354 DID_MOUNT_STATE ,
510355 ) ;
511- expect ( instance . _testJournal . lifeCycleAtStartOfDidMount ) . toBe ( 'MOUNTED' ) ;
512356
513357 // initial render
514358 expect ( instance . _testJournal . stateInInitialRender ) . toEqual (
515359 INIT_RENDER_STATE ,
516360 ) ;
517- expect ( instance . _testJournal . lifeCycleInInitialRender ) . toBe ( 'UNMOUNTED' ) ;
518-
519- expect ( getLifeCycleState ( instance ) ) . toBe ( 'MOUNTED' ) ;
520361
521362 // Now *update the component*
522363 instance . forceUpdate ( ) ;
523364
524365 // render 2nd time
525366 expect ( instance . _testJournal . stateInLaterRender ) . toEqual ( NEXT_RENDER_STATE ) ;
526- expect ( instance . _testJournal . lifeCycleInLaterRender ) . toBe ( 'MOUNTED' ) ;
527-
528- expect ( getLifeCycleState ( instance ) ) . toBe ( 'MOUNTED' ) ;
529367
530368 await act ( ( ) => {
531369 root . unmount ( ) ;
@@ -535,10 +373,8 @@ describe('ReactComponentLifeCycle', () => {
535373 WILL_UNMOUNT_STATE ,
536374 ) ;
537375 // componentWillUnmount called right before unmount.
538- expect ( instance . _testJournal . lifeCycleAtStartOfWillUnmount ) . toBe ( 'MOUNTED' ) ;
539376
540377 // But the current lifecycle of the component is unmounted.
541- expect ( getLifeCycleState ( instance ) ) . toBe ( 'UNMOUNTED' ) ;
542378 expect ( instance . state ) . toEqual ( POST_WILL_UNMOUNT_STATE ) ;
543379 } ) ;
544380
0 commit comments