@@ -23,15 +23,31 @@ describe('refs-destruction', () => {
23
23
ReactDOM = require ( 'react-dom' ) ;
24
24
ReactTestUtils = require ( 'react-dom/test-utils' ) ;
25
25
26
+ class ClassComponent extends React . Component {
27
+ render ( ) {
28
+ return null ;
29
+ }
30
+ }
31
+
26
32
TestComponent = class extends React . Component {
27
33
render ( ) {
28
- return (
29
- < div >
30
- { this . props . destroy ? null : (
31
- < div ref = "theInnerDiv" > Lets try to destroy this.</ div >
32
- ) }
33
- </ div >
34
- ) ;
34
+ if ( this . props . destroy ) {
35
+ return < div /> ;
36
+ } else if ( this . props . removeRef ) {
37
+ return (
38
+ < div >
39
+ < div />
40
+ < ClassComponent />
41
+ </ div >
42
+ ) ;
43
+ } else {
44
+ return (
45
+ < div >
46
+ < div ref = "theInnerDiv" />
47
+ < ClassComponent ref = "theInnerClassComponent" />
48
+ </ div >
49
+ ) ;
50
+ }
35
51
}
36
52
} ;
37
53
} ) ;
@@ -45,7 +61,7 @@ describe('refs-destruction', () => {
45
61
expect (
46
62
Object . keys ( testInstance . refs || { } ) . filter ( key => testInstance . refs [ key ] )
47
63
. length ,
48
- ) . toEqual ( 1 ) ;
64
+ ) . toEqual ( 2 ) ;
49
65
ReactDOM . unmountComponentAtNode ( container ) ;
50
66
expect (
51
67
Object . keys ( testInstance . refs || { } ) . filter ( key => testInstance . refs [ key ] )
@@ -62,14 +78,31 @@ describe('refs-destruction', () => {
62
78
expect (
63
79
Object . keys ( testInstance . refs || { } ) . filter ( key => testInstance . refs [ key ] )
64
80
. length ,
65
- ) . toEqual ( 1 ) ;
81
+ ) . toEqual ( 2 ) ;
66
82
ReactDOM . render ( < TestComponent destroy = { true } /> , container ) ;
67
83
expect (
68
84
Object . keys ( testInstance . refs || { } ) . filter ( key => testInstance . refs [ key ] )
69
85
. length ,
70
86
) . toEqual ( 0 ) ;
71
87
} ) ;
72
88
89
+ it ( 'should remove refs when removing the child ref attribute' , ( ) => {
90
+ const container = document . createElement ( 'div' ) ;
91
+ const testInstance = ReactDOM . render ( < TestComponent /> , container ) ;
92
+ expect ( ReactTestUtils . isDOMComponent ( testInstance . refs . theInnerDiv ) ) . toBe (
93
+ true ,
94
+ ) ;
95
+ expect (
96
+ Object . keys ( testInstance . refs || { } ) . filter ( key => testInstance . refs [ key ] )
97
+ . length ,
98
+ ) . toEqual ( 2 ) ;
99
+ ReactDOM . render ( < TestComponent removeRef = { true } /> , container ) ;
100
+ expect (
101
+ Object . keys ( testInstance . refs || { } ) . filter ( key => testInstance . refs [ key ] )
102
+ . length ,
103
+ ) . toEqual ( 0 ) ;
104
+ } ) ;
105
+
73
106
it ( 'should not error when destroying child with ref asynchronously' , ( ) => {
74
107
class Modal extends React . Component {
75
108
componentDidMount ( ) {
0 commit comments