@@ -51,50 +51,62 @@ window.__enqueueForceUpdate = function(onSuccess, type) {
51
51
}
52
52
} ) ;
53
53
} ;
54
+
55
+ function traverseDeep ( root , onUpdate ) {
56
+ let node = root ;
57
+ while ( true ) {
58
+ node . expirationTime = 1 ;
59
+ if ( node . alternate ) {
60
+ node . alternate . expirationTime = 1 ;
61
+ }
62
+ if ( node . tag === 1 ) {
63
+ onUpdate ( node ) ;
64
+ }
65
+ if ( node . child ) {
66
+ node . child . return = node ;
67
+ node = node . child ;
68
+ continue ;
69
+ }
70
+ if ( node === root ) {
71
+ return ;
72
+ }
73
+ while ( ! node . sibling ) {
74
+ if ( ! node . return || node . return === root ) {
75
+ return ;
76
+ }
77
+ node = node . return ;
78
+ }
79
+ node . sibling . return = node . return ;
80
+ node = node . sibling ;
81
+ }
82
+ }
83
+
54
84
function forceUpdateAll ( types ) {
55
85
const hook = window . __REACT_DEVTOOLS_GLOBAL_HOOK__ ;
56
86
const renderersById = hook . _renderers ;
57
87
const ids = Object . keys ( renderersById ) ;
58
- const renderers = ids . map ( id => renderersById [ id ] ) ;
59
- // TODO: support Fiber
60
- renderers . forEach ( renderer => {
61
- const roots = renderer . Mount && renderer . Mount . _instancesByReactRootID ;
62
- const { getNodeFromInstance } = renderer . ComponentTree ;
63
- if ( ! roots ) {
88
+ ids . forEach ( id => {
89
+ const renderer = renderersById [ id ] ;
90
+ const roots = hook . getFiberRoots ( id ) ;
91
+ if ( ! roots . size ) {
64
92
return ;
65
93
}
66
- Object . keys ( roots ) . forEach ( key => {
67
- function traverseDeep ( ins , cb ) {
68
- cb ( ins ) ;
69
- if ( ins . _renderedComponent ) {
70
- traverseDeep ( ins . _renderedComponent , cb ) ;
71
- } else {
72
- for ( let key in ins . _renderedChildren ) {
73
- if ( ins . _renderedChildren . hasOwnProperty ( key ) ) {
74
- traverseDeep ( ins . _renderedChildren [ key ] , cb ) ;
75
- }
76
- }
77
- }
78
- }
79
- const root = roots [ key ] ;
80
- traverseDeep ( root , inst => {
81
- if ( ! inst . _instance ) {
82
- return ;
83
- }
84
- const { type, type : { __hot__id } } = inst . _currentElement ;
94
+ // TODO: this is WAY too brittle.
95
+ roots . forEach ( root => {
96
+ const reactRoot = root . containerInfo . _reactRootContainer ;
97
+ traverseDeep ( root . current , node => {
98
+ const type = node . type ;
99
+ const { __hot__id } = type ;
85
100
if (
86
101
types . find (
87
102
t => t === type || ( __hot__id && t . __hot__id === __hot__id )
88
103
)
89
104
) {
90
- nodes . push ( getNodeFromInstance ( inst ) ) ;
91
- }
92
- const updater = inst . _instance . updater ;
93
- if ( ! updater || typeof updater . enqueueForceUpdate !== 'function' ) {
94
- return ;
105
+ nodes . push ( renderer . findHostInstanceByFiber ( node ) ) ;
95
106
}
96
- updater . enqueueForceUpdate ( inst . _instance ) ;
107
+ node . memoizedProps = Object . assign ( { } , node . memoizedProps ) ;
97
108
} ) ;
109
+ reactRoot . render ( root . current . memoizedState . element ) ;
98
110
} ) ;
99
111
} ) ;
100
112
}
0 commit comments