-
Notifications
You must be signed in to change notification settings - Fork 1
/
reconciler.js
108 lines (92 loc) · 2.47 KB
/
reconciler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import Reconciler from 'react-reconciler';
import {
unstable_scheduleCallback as schedulePassiveEffects,
unstable_cancelCallback as cancelPassiveEffects,
unstable_now as now,
} from 'scheduler';
import {Node} from './Node';
const roots = new Map();
function appendInitialChild(parent, child) {
parent.add(child);
}
function appendChild(parent, child) {
parent.add(child);
}
function appendChildToContainer(parent, child) {
parent.add(child);
}
function removeChild(parent, child) {
parent.remove(child);
}
function insertBefore(parentInstance, child, beforeChild) {
parentInstance.add(child);
}
function createInstance(type, props, container, hostContext, fiber) {
const instance = new Node(type, props, container);
return instance;
}
function commitUpdate(
instance,
updatePayload,
type,
oldProps,
newProps,
fiber,
) {
// this is only called if prepareUpdate returns a payload. That payload is passed
// into here as updatePayload.
instance.queueDraw();
}
function prepareUpdate(
instance,
type,
oldProps,
newProps,
rootContainerInstance,
hostContext,
) {
const {args, ...props} = newProps;
instance.args = args;
instance.props = props;
// instance.context = hostContext;
// if something is returned here then commitUpdate will be called for this instance.
// If nothing if returned then it will not be called
return {...hostContext};
}
const Renderer = Reconciler({
now,
supportsMutation: true,
isPrimaryRenderer: false,
createInstance,
removeChild,
appendChild,
appendInitialChild,
appendChildToContainer,
removeChildFromContainer: removeChild,
schedulePassiveEffects,
cancelPassiveEffects,
commitUpdate,
prepareUpdate,
insertBefore,
getPublicRootInstance: () => {},
getPublicInstance: instance => instance,
getRootHostContext: rootContainerInstance => [], // Context to pass down from root
getChildHostContext: () => [],
createTextInstance: () => {},
finalizeInitialChildren: (instance, type, props, rootContainerInstance) =>
false,
shouldDeprioritizeSubtree: (type, props) => false,
prepareForCommit: rootContainerInstance => {},
resetAfterCommit: () => {},
shouldSetTextContent: props => false,
});
export function render(el, container) {
let root = roots.get(container);
if (!root) {
root = Renderer.createContainer(container);
roots.set(container, root);
}
Renderer.updateContainer(el, root, null, undefined);
return Renderer.getPublicRootInstance(root);
}
export default {};