Skip to content

Commit 2d8eb24

Browse files
committed
Update
1 parent 31d5eca commit 2d8eb24

File tree

5 files changed

+81
-68
lines changed

5 files changed

+81
-68
lines changed

packages/react-dev-utils/forceUpdateHook.js

+43-31
Original file line numberDiff line numberDiff line change
@@ -51,50 +51,62 @@ window.__enqueueForceUpdate = function(onSuccess, type) {
5151
}
5252
});
5353
};
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+
5484
function forceUpdateAll(types) {
5585
const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;
5686
const renderersById = hook._renderers;
5787
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) {
6492
return;
6593
}
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;
85100
if (
86101
types.find(
87102
t => t === type || (__hot__id && t.__hot__id === __hot__id)
88103
)
89104
) {
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));
95106
}
96-
updater.enqueueForceUpdate(inst._instance);
107+
node.memoizedProps = Object.assign({}, node.memoizedProps);
97108
});
109+
reactRoot.render(root.current.memoizedState.element);
98110
});
99111
});
100112
}

packages/react-dev-utils/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"is-root": "1.0.0",
5555
"opn": "5.2.0",
5656
"pkg-up": "2.0.0",
57+
"react-devtools-core": "2.1.9",
5758
"react-error-overlay": "^4.0.0",
5859
"recursive-readdir": "2.2.1",
5960
"shell-quote": "1.6.1",
+23-25
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,26 @@
1-
import React, { Component } from 'react';
2-
import Logo from './Logo';
1+
import React from 'react';
2+
import Counter from './Counter';
3+
import logo from './logo.svg';
34
import './App.css';
45

5-
class App extends Component {
6-
render() {
7-
return (
8-
<div className="App">
9-
<header className="App-header">
10-
<img src={logo} className="App-logo" alt="logo" />
11-
<p>
12-
Edit <code>src/App.js</code> and save to reload.
13-
</p>
14-
<a
15-
className="App-link"
16-
href="https://reactjs.org"
17-
target="_blank"
18-
rel="noopener noreferrer"
19-
>
20-
Learn React
21-
</a>
22-
</header>
23-
</div>
24-
);
25-
}
6+
export default function App() {
7+
return (
8+
<div className="App">
9+
<header className="App-header">
10+
<img src={logo} className="App-logo" alt="logo" />
11+
<p>
12+
Edit <code>src/App.js</code> and save to reload.
13+
</p>
14+
<Counter />
15+
<a
16+
className="App-link"
17+
href="https://reactjs.org"
18+
target="_blank"
19+
rel="noopener noreferrer"
20+
>
21+
Learn React
22+
</a>
23+
</header>
24+
</div>
25+
);
2626
}
27-
28-
export default App;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React, { Component } from 'react';
2+
3+
export default class Counter extends Component {
4+
state = { value: 0 };
5+
componentDidMount() {
6+
this.interval = setInterval(
7+
() => this.setState(s => ({ value: s.value + 1 })),
8+
1000
9+
);
10+
}
11+
render() {
12+
return <h1>{this.state.value}</h1>;
13+
}
14+
}

packages/react-scripts/template/src/Logo.js

-12
This file was deleted.

0 commit comments

Comments
 (0)