mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-05-30 10:16:42 +08:00
Refactor Attribute Processing (Step 1)
Summary: Concolidate the creation of the "update payload" into ReactNativeAttributePayload which now has a create and a diff version. The create version can be used by both mountComponent and setNativeProps. This means that diffRawProperties moves into ReactNativeAttributePayload. Instead of storing previousFlattenedStyle as memoized state in the component tree, I recalculate it every time. This allows better use of the generational GC. However, it is still probably a fairly expensive technique so I will follow it up with a diff that walks both nested array trees to do the diffing in a follow up. This is the first diff of several steps. @public Reviewed By: @vjeux Differential Revision: D2440644 fb-gh-sync-id: 1d0da4f6e2bf716f33e119df947c044abb918471
This commit is contained in:
committed by
facebook-github-bot-4
parent
62e8ddc205
commit
6c5024ec58
@@ -13,6 +13,7 @@
|
||||
|
||||
var NativeModules = require('NativeModules');
|
||||
var RCTUIManager = NativeModules.UIManager;
|
||||
var ReactNativeAttributePayload = require('ReactNativeAttributePayload');
|
||||
var TextInputState = require('TextInputState');
|
||||
|
||||
var findNodeHandle = require('findNodeHandle');
|
||||
@@ -65,52 +66,15 @@ var NativeMethodsMixin = {
|
||||
* next render, they will remain active.
|
||||
*/
|
||||
setNativeProps: function(nativeProps: Object) {
|
||||
// nativeProps contains a style attribute that's going to be flattened
|
||||
// and all the attributes expanded in place. In order to make this
|
||||
// process do as few allocations and copies as possible, we return
|
||||
// one if the other is empty. Only if both have values then we create
|
||||
// a new object and merge.
|
||||
var hasOnlyStyle = true;
|
||||
for (var key in nativeProps) {
|
||||
if (key !== 'style') {
|
||||
hasOnlyStyle = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var validAttributes = this.viewConfig.validAttributes;
|
||||
var hasProcessedProps = false;
|
||||
var processedProps = {};
|
||||
for (var key in nativeProps) {
|
||||
var process = validAttributes[key] && validAttributes[key].process;
|
||||
if (process) {
|
||||
hasProcessedProps = true;
|
||||
processedProps[key] = process(nativeProps[key]);
|
||||
}
|
||||
}
|
||||
|
||||
var style = precomputeStyle(
|
||||
flattenStyle(processedProps.style || nativeProps.style),
|
||||
var updatePayload = ReactNativeAttributePayload.create(
|
||||
nativeProps,
|
||||
this.viewConfig.validAttributes
|
||||
);
|
||||
|
||||
var props = null;
|
||||
if (hasOnlyStyle) {
|
||||
props = style;
|
||||
} else {
|
||||
props = nativeProps;
|
||||
if (hasProcessedProps) {
|
||||
props = mergeFast(props, processedProps);
|
||||
}
|
||||
if (style) {
|
||||
props = mergeFast(props, style);
|
||||
}
|
||||
}
|
||||
|
||||
RCTUIManager.updateView(
|
||||
findNodeHandle(this),
|
||||
this.viewConfig.uiViewClassName,
|
||||
props
|
||||
updatePayload
|
||||
);
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user