[关闭]
@linux1s1s 2017-03-14T16:58:36.000000Z 字数 1732 阅读 1555

React-Native Primary 滚动视图

React-Native 2017-03


在RN中滚动视图包含两部分的内容【ScrollView】和【ListView】

ScrollView

废话不多少,直接上源码

  1. import React, {Component} from 'react';
  2. import {ScrollView, AppRegistry, StyleSheet, Image, Text, View} from 'react-native';
  3. import {NavigationLayout as width} from "react-native/Libraries/NavigationExperimental/NavigationTypeDefinition";
  4. var styles = StyleSheet.create({
  5. scrollViewStyle: {
  6. backgroundColor: 'red',
  7. },
  8. itemStyle: {
  9. width: width,
  10. height: 200,
  11. },
  12. });
  13. var NwesomeProject = React.createClass({
  14. render(){
  15. return (
  16. <ScrollView style={styles.scrollViewStyle}>
  17. {this.renderItem()}
  18. </ScrollView>
  19. );
  20. },
  21. renderItem(){
  22. var itemArray = [];
  23. var colorArray = ['gray', 'green', 'blue', 'yellow', 'black', 'orange'];
  24. for (var i = 0; i < 60; i++) {
  25. itemArray.push(<View key={i} style={[styles.itemStyle, {backgroundColor: colorArray[i%6]}]}/>);
  26. }
  27. return itemArray;
  28. }
  29. });
  30. AppRegistry.registerComponent('NwesomeProject', () => NwesomeProject);
  1. <ScrollView>
  2. <Child1 />
  3. <Child2 />
  4. ...
  5. </ScrollView>

它和 View 组件一样,可以包含一个或者多个子组件。对子组件的布局可以是垂直或者水平的,通过属性 horizontal=true/false 来控制。

为了检测性能问题,我们特意把列表拉长到60个,然后我们看看是不是RN-ScrollView无脑帮我们一直把子View添加到View树中

此处输入图片的描述

从上图看,屏幕中的子View个数正好和添加到ViewGroup的相等,所以可以推断,屏幕外的子 View,就被自动从 View 树中移除,这样可以提升性能。

但是,虽然ScrollView将当前不显示的View移出ViewGroup,但是还是将这些子View都初始化了,这将导致子View越多,渲染的时间和内存也会线性增加。

此处输入图片的描述

具体原因可以追踪代码,简单说结论是在RN-ScrollView中,所有的子 View 都是同时创建的。因此:RN 中的 ScrollView 并不像我们想象的那样高性能。

ListView

ListView是基于ScrollView的,并且做了一些优化,主要体现在ListView在初始化的时候默认初始10个子View,而并没有像ScrollView那么简单粗暴。

ListView 在第一次加载的时候,不论你的列表有多大,默认最多加载 initialListSize (默认10)个子项,所以能保证启动速度,如果还没有充满,或者在向下滑动过程中,再组件添加子项。这样的操作似乎比较合理,但是注意到,整个操作中,会逐渐向 ListView 中添加子项,新出现的子项,都是通过创建新的 View,而完全没有复用的过程。所以,如果在应用中,ListView 中的子项数量特别多,ListView 往下滑动的过程中,内存会逐渐上涨的。

解决办法

参考:React Native 中 ScrollView 性能探究

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注