mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-02-09 09:12:06 +08:00
Summary: Remove layout-only views. Works by checking properties against a list of known properties that only affect layout. The `RCTShadowView` hierarchy still has a 1:1 correlation with the JS nodes. This works by adjusting the tags and indices in `manageChildren`. For example, if JS told us to insert tag 1 at index 0 and tag 1 is layout-only with children whose tags are 2 and 3, we adjust it so we insert tags 2 and 3 at indices 0 and 1. This keeps changes out of `RCTView` and `RCTScrollView`. In order to simplify this logic, view moves are now processed as view removals followed by additions. A move from index 0 to 1 is recorded as a removal of view at indices 0 and 1 and an insertion of tags 1 and 2 at indices 0 and 1. Of course, the remaining indices have to be offset to take account for this. The `collapsible` attribute is a bit of a hack to force `RCTScrollView` to always have one child. This was easier than rethinking out the logic there, but we could change this later. @public Test Plan: There are tests in `RCTUIManagerTests.m` that test the tag- and index-manipulation logic works. There are various scenarios including add-only, remove-only, and move. In addition, two scenario tests verify that the optimization works by checking the number of views and shadow views after various situations happen.
42 lines
1.2 KiB
JavaScript
42 lines
1.2 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @providesModule ReactNativeViewAttributes
|
|
* @flow
|
|
*/
|
|
'use strict';
|
|
|
|
var merge = require('merge');
|
|
|
|
var ReactNativeViewAttributes = {};
|
|
|
|
ReactNativeViewAttributes.UIView = {
|
|
pointerEvents: true,
|
|
accessible: true,
|
|
accessibilityLabel: true,
|
|
accessibilityTraits: true,
|
|
testID: true,
|
|
onLayout: true,
|
|
onAccessibilityTap: true,
|
|
onMagicTap: true,
|
|
collapsible: true,
|
|
};
|
|
|
|
ReactNativeViewAttributes.RCTView = merge(
|
|
ReactNativeViewAttributes.UIView, {
|
|
|
|
// This is a special performance property exposed by RCTView and useful for
|
|
// scrolling content when there are many subviews, most of which are offscreen.
|
|
// For this property to be effective, it must be applied to a view that contains
|
|
// many subviews that extend outside its bound. The subviews must also have
|
|
// overflow: hidden, as should the containing view (or one of its superviews).
|
|
removeClippedSubviews: true,
|
|
});
|
|
|
|
module.exports = ReactNativeViewAttributes;
|