Read "current" props from the node instead of the Fiber (#8839)
It's not just events that read the current props. Controlled components do as well. Since we're no longer updating the Fiber pointer during updates we have to instead read from the node props to get the current props. Since this method is no longer just used for events I renamed it.
Sebastian Markbåge committed
Jan 20, 2017 at 23:25 UTC
4f8c16a750916f4eb250e22575fc6dbc6ae2bd9c
9 files changed
+21
-20
scripts/fiber/tests-failing.txt
-3
@@ -37,9 +37,6 @@ src/renderers/dom/shared/__tests__/ReactRenderDocument-test.js
37
* should throw on full document render w/ no markup
38
* supports findDOMNode on full-page components
39
40
-src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js
41
-* should control a value in reentrant events
42
-
40
src/renderers/shared/__tests__/ReactPerf-test.js
41
* should count no-op update as waste
42
* should count no-op update in child as waste
scripts/fiber/tests-passing.txt
+1
@@ -960,6 +960,7 @@ src/renderers/dom/shared/wrappers/__tests__/ReactDOMIframe-test.js
960
961
src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js
962
* should properly control a value even if no event listener exists
963
+* should control a value in reentrant events
964
* should control values in reentrant events with different targets
965
* should display `defaultValue` of number 0
966
* only assigns defaultValue if it changes
src/renderers/dom/fiber/ReactDOMFiber.js
+3
-3
@@ -40,7 +40,7 @@ var {
40
} = ReactDOMFiberComponent;
41
var {
42
precacheFiberNode,
43
- updateFiberEventHandlers,
43
+ updateFiberProps,
44
} = ReactDOMComponentTree;
45
46
if (__DEV__) {
@@ -188,7 +188,7 @@ var DOMRenderer = ReactFiberReconciler({
188
}
189
const domElement : Instance = createElement(type, props, rootContainerInstance, parentNamespace);
190
precacheFiberNode(internalInstanceHandle, domElement);
191
- updateFiberEventHandlers(domElement, props);
191
+ updateFiberProps(domElement, props);
192
return domElement;
193
},
194
@@ -246,7 +246,7 @@ var DOMRenderer = ReactFiberReconciler({
246
) : void {
247
// Update the props handle so that we know which props are the ones with
248
// with current event handlers.
249
- updateFiberEventHandlers(domElement, newProps);
249
+ updateFiberProps(domElement, newProps);
250
// Apply the diff to the DOM node.
251
updateProperties(domElement, updatePayload, type, oldProps, newProps);
252
},
src/renderers/dom/shared/ReactDOMComponentTree.js
+4
-4
@@ -221,11 +221,11 @@ function getNodeFromInstance(inst) {
221
return inst._hostNode;
222
}
223
224
-function getFiberEventHandlersFromNode(node) {
224
+function getFiberCurrentPropsFromNode(node) {
225
return node[internalEventHandlersKey] || null;
226
}
227
228
-function updateFiberEventHandlers(node, props) {
228
+function updateFiberProps(node, props) {
229
node[internalEventHandlersKey] = props;
230
}
231
@@ -237,8 +237,8 @@ var ReactDOMComponentTree = {
237
precacheNode: precacheNode,
238
uncacheNode: uncacheNode,
239
precacheFiberNode: precacheFiberNode,
240
- getFiberEventHandlersFromNode,
241
- updateFiberEventHandlers,
240
+ getFiberCurrentPropsFromNode,
241
+ updateFiberProps,
242
};
243
244
module.exports = ReactDOMComponentTree;
src/renderers/native/ReactNativeComponentTree.js
+3
-3
@@ -70,7 +70,7 @@ function getFiberEventHandlersFromTag(tag) {
70
return instanceProps[tag] || null;
71
}
72
73
-function updateFiberEventHandlers(tag, props) {
73
+function updateFiberProps(tag, props) {
74
instanceProps[tag] = props;
75
}
76
@@ -82,8 +82,8 @@ var ReactNativeComponentTree = {
82
precacheNode,
83
uncacheFiberNode,
84
uncacheNode,
85
- getFiberEventHandlersFromNode: getFiberEventHandlersFromTag,
86
- updateFiberEventHandlers,
85
+ getFiberCurrentPropsFromNode: getFiberEventHandlersFromTag,
86
+ updateFiberProps,
87
};
88
89
module.exports = ReactNativeComponentTree;
src/renderers/native/ReactNativeFiber.js
+3
-3
@@ -36,7 +36,7 @@ const invariant = require('invariant');
36
const {
37
precacheFiberNode,
38
uncacheFiberNode,
39
- updateFiberEventHandlers,
39
+ updateFiberProps,
40
} = ReactNativeComponentTree;
41
42
ReactNativeInjection.inject();
@@ -133,7 +133,7 @@ const NativeRenderer = ReactFiberReconciler({
133
) : void {
134
const viewConfig = instance.viewConfig;
135
136
- updateFiberEventHandlers(instance._nativeTag, newProps);
136
+ updateFiberProps(instance._nativeTag, newProps);
137
138
const updatePayload = ReactNativeAttributePayload.diff(
139
oldProps,
@@ -181,7 +181,7 @@ const NativeRenderer = ReactFiberReconciler({
181
const component = new NativeHostComponent(tag, viewConfig);
182
183
precacheFiberNode(internalInstanceHandle, tag);
184
- updateFiberEventHandlers(tag, props);
184
+ updateFiberProps(tag, props);
185
186
return component;
187
},
src/renderers/shared/shared/event/EventPluginHub.js
+1
-1
@@ -126,7 +126,7 @@ var EventPluginHub = {
126
// TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
127
// live here; needs to be moved to a better place soon
128
if (typeof inst.tag === 'number') {
129
- const props = EventPluginUtils.getFiberEventHandlersFromNode(
129
+ const props = EventPluginUtils.getFiberCurrentPropsFromNode(
130
inst.stateNode
131
);
132
if (!props) {
src/renderers/shared/shared/event/EventPluginUtils.js
+2
-2
@@ -219,8 +219,8 @@ var EventPluginUtils = {
219
executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,
220
hasDispatches: hasDispatches,
221
222
- getFiberEventHandlersFromNode: function(node) {
223
- return ComponentTree.getFiberEventHandlersFromNode(node);
222
+ getFiberCurrentPropsFromNode: function(node) {
223
+ return ComponentTree.getFiberCurrentPropsFromNode(node);
224
},
225
getInstanceFromNode: function(node) {
226
return ComponentTree.getInstanceFromNode(node);
src/renderers/shared/shared/event/ReactControlledComponent.js
+4
-1
@@ -45,10 +45,13 @@ function restoreStateOfTarget(target) {
45
'Fiber needs to be injected to handle a fiber target for controlled ' +
46
'events.'
47
);
48
+ const props = EventPluginUtils.getFiberCurrentPropsFromNode(
49
+ internalInstance.stateNode
50
+ );
51
fiberHostComponent.restoreControlledState(
52
internalInstance.stateNode,
53
internalInstance.type,
51
- internalInstance.memoizedProps
54
+ props
55
);
56
return;
57
}