简体   繁体   English

React Native ListView性能太慢了?

[英]React Native ListView performance is too slow?

I have 113 records in my application.react native listView is taking more than 3 seconds to render all the rows. 我的application.react本机listView中有113条记录需要3秒多的时间才能呈现所有行。 how can i make it efficient so time consumption can be minimum and app experience can be smooth. 如何使其高效,以便时间消耗最小化,应用体验可以顺利进行。 i have checked the same application in ios and it is much efficient as compared to react-native app version. 我在ios中检查了相同的应用程序,与react-native app版本相比,它效率更高。 I have one avatar image and name and button in each row. 我每行都有一个头像图像和名称和按钮。

Here is my code for listview 这是listview的代码

var Ziglist = React.createClass({
getInitialState: function() {
     return {
        isLoading: true,
        resultsData: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 != row2 }),
      };
},

componentWillMount: function(){
  PeopleStore.listen(this.onChange);
  PeopleActions.getPeopleFollowing();
},

componentWillUnmount() {
  PeopleStore.unlisten(this.onChange);
},

onChange(state) {
this.setState({resultsData: this.getDataSource(state.resultsData)})
},

getDataSource: function(mediaItem: Array<any>): ListView.dataSource {
  return this.state.resultsData.cloneWithRows(mediaItem)
},
render: function() {
    return (
  <View style={{flex: 1}} >
  <ListView
    dataSource={this.state.resultsData}
    renderRow={this.renderRow}
    renderSeperator={this.renderSeperator}
    contentInset={{top: 0}}
    automaticallyAdjustContentInsets={false}
  />
  <Button
    containerStyle={styles.goAhead}
    style={styles.base}
    onPress={() => this.onStartPress()}>
    <Text style={[styles.base,styles.go]}>Ok, Lets GO > </Text>
  </Button>
 </View>
);
},
renderSeparator: function (sectionID: number | 
string, rowID: number | string, adjacentRowHighlighted: boolean ) {
 return (
    <View key={"SEP_" + sectionID + "_" + rowID} />
 );
},
renderRow: function (
 media: Object,
 sectionID: number | string,
 rowID: number | string,
 highlightRowFunction: (sectionID: ?number | string, 
 rowID: ?number | string) => void,) {
  return (
    <CelebrityRow
     media={media}
     onSelect={() => this.selectMediaItem(media)}
     onHighlight={() => highlightRowFunction(sectionID,rowID)}
     onDeHighlight={() => highlightRowFunction(null,null)}
    />
 );
},
selectMediaItem: function (mediaItem) {
this.props.navigator.push({
  name: 'celebrityDetailView',
  passProps: {
    mediaItem: mediaItem
  }
});
}

and here is the code for Celebrity Row 这是Celebrity Row的代码

var CelebrityRow = React.createClass({
getInitialState: function() {
    return {
        following_ids: FollowingStore.getState().following_ids,
        unfollowing_ids: FollowingStore.getState().unfollowing_ids,
        icon: null,
        follow: true
    }
},
componentWillMount: function() {
    if (_.indexOf(this.state.unfollowing_ids, this.props.media.id) > -1) {
        this.setState({
            follow: !this.state.follow
        });
    }
},
componentWillUnmount: function() {},
componentDidMount: function() {
    var _unfollowing_ids = FollowingStore.getState().unfollowing_ids;

    if (_unfollowing_ids.length > 0 && this.state.follow === false) {
        var following_arr = PeopleStore.getState().resultsData;
        var _following_ids = FollowingStore.getState().following_ids;

        _.each(_unfollowing_ids, function(id) {
            var find = _.findWhere(following_arr, {
                id: id
            });
            following_arr = _.without(following_arr, find);
        });

        var following_ids = _.difference(_following_ids, _unfollowing_ids);

        this.setState({
            unfollowing_ids: [],
            following_ids: following_ids
        });
        var _this = this;
        setTimeout(function() {
            FollowingActions.updateFollowingIdsWithStorage(following_ids);
            FollowingActions.updateUnFollowingIds([]);
            PeopleActions.updatePeopleFollowingWithStorage(following_arr);
            _this.setState({
                follow: true
            })
        }, 1000);

    }

},
onChange: function(state) {
    // this.setState({unfollowing_ids: state.unfollowing_ids});
},
onAddPress: function(media) {

    this.setState({
        follow: !this.state.follow
    });
    FollowingActions.updateUnFollowingIds(media.id);
},
render: function() {

    return ( <
        View style = {
            styles.row
        } >
        <
        TouchableHighlight onPress = {
            this.props.onSelect
        }
        onShowUnderlay = {
            this.props.onHighlight
        }
        onHideUnderlay = {
            this.props.onDeHighlight
        } >
        <
        View style = {
            styles.cellContainer
        } >
        <
        Image source = {
            {
                uri: this.props.media.avatar_url
            }
        }
        style = {
            styles.cellImage
        }
        /> <
        Text style = {
            styles.CelebrityName
        }
        numberOfLines = {
            1
        } > {
            this.props.media.name
        } < /Text>

        <
        View style = {
            styles.celebrityAdd
        } >
        <
        Button onPress = {
            () => this.onAddPress(this.props.media)
        } > {
            (this.state.follow ?
                ( <
                    Image source = {
                        require("../assets/tick-mark.png")
                    }
                    style = {
                        styles.addIcon
                    }
                    />
                ) : ( <
                    Image source = {
                        require("../assets/img-small-add.png")
                    }
                    style = {
                        styles.removeIcon
                    }
                    />
                )
            )
        } <
        /Button> <
        /View>

        <
        /View> <
        /TouchableHighlight> <
        /View>

    );
}

}); });

Instead of render the whole 100+ rows at once, you can set initialListSize prop to increase the rendering performance. 您可以设置initialListSize prop来提高渲染性能,而不是一次渲染整个100多行。

reference : http://facebook.github.io/react-native/releases/0.30/docs/performance.html#listview-initial-rendering-is-too-slow-or-scroll-performance-is-bad-for-large-lists 参考: http//facebook.github.io/react-native/releases/0.30/docs/performance.html#listview-initial-rendering-is-too-slow-or-scroll-performance-is-bad-for-大名单

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM