@@ -16,6 +16,7 @@ class Tree extends React.Component {
16
16
// eslint-disable-next-line react/no-unused-state
17
17
dataRef : this . props . data ,
18
18
data : Tree . assignInternalProperties ( clone ( this . props . data ) ) ,
19
+ d3 : Tree . calculateD3Geometry ( this . props ) ,
19
20
rd3tSvgClassName : `_${ uuid . v4 ( ) } ` ,
20
21
rd3tGClassName : `_${ uuid . v4 ( ) } ` ,
21
22
} ;
@@ -24,10 +25,6 @@ class Tree extends React.Component {
24
25
initialRender : true ,
25
26
targetNode : null ,
26
27
isTransitioning : false ,
27
- d3 : {
28
- scale : this . props . zoom ,
29
- translate : this . props . translate ,
30
- } ,
31
28
} ;
32
29
33
30
static getDerivedStateFromProps ( nextProps , prevState ) {
@@ -40,12 +37,13 @@ class Tree extends React.Component {
40
37
} ;
41
38
}
42
39
43
- return null ;
44
- }
40
+ if ( ! deepEqual ( Tree . calculateD3Geometry ( nextProps ) , prevState . d3 ) ) {
41
+ return {
42
+ d3 : Tree . calculateD3Geometry ( nextProps ) ,
43
+ } ;
44
+ }
45
45
46
- constructor ( props ) {
47
- super ( props ) ;
48
- this . internalState . d3 = Tree . calculateD3Geometry ( this . props ) ;
46
+ return null ;
49
47
}
50
48
51
49
componentDidMount ( ) {
@@ -68,13 +66,12 @@ class Tree extends React.Component {
68
66
if ( typeof this . props . onUpdate === 'function' ) {
69
67
this . props . onUpdate ( {
70
68
node : this . internalState . targetNode ? clone ( this . internalState . targetNode ) : null ,
71
- zoom : this . internalState . d3 . scale ,
72
- translate : this . internalState . d3 . translate ,
69
+ zoom : this . state . d3 . scale ,
70
+ translate : this . state . d3 . translate ,
73
71
} ) ;
74
-
75
- this . internalState . d3 = Tree . calculateD3Geometry ( this . props ) ;
76
- this . internalState . targetNode = null ;
77
72
}
73
+ // Reset the last target node after we've flushed it to `onUpdate`.
74
+ this . internalState . targetNode = null ;
78
75
}
79
76
80
77
/**
@@ -120,8 +117,8 @@ class Tree extends React.Component {
120
117
zoom : event . scale ,
121
118
translate : { x : event . translate [ 0 ] , y : event . translate [ 1 ] } ,
122
119
} ) ;
123
- this . internalState . d3 . scale = event . scale ;
124
- this . internalState . d3 . translate = { x : event . translate [ 0 ] , y : event . translate [ 1 ] } ;
120
+ this . state . d3 . scale = event . scale ;
121
+ this . state . d3 . translate = { x : event . translate [ 0 ] , y : event . translate [ 1 ] } ;
125
122
}
126
123
} )
127
124
// Offset so that first pan and zoom does not jump back to [0,0] coords
@@ -501,7 +498,7 @@ class Tree extends React.Component {
501
498
allowForeignObjects,
502
499
styles,
503
500
} = this . props ;
504
- const { translate, scale } = this . internalState . d3 ;
501
+ const { translate, scale } = this . state . d3 ;
505
502
const subscriptions = { ...nodeSize , ...separation , depthFactor, initialDepth } ;
506
503
return (
507
504
< div className = { `rd3t-tree-container ${ zoomable ? 'rd3t-grabbable' : undefined } ` } >
0 commit comments