React Native - 如何在加载 ListView 时提高响应能力
React Native - How to improve responsiveness while ListView is loading
我有一个列表视图,正在加载大量数据。在加载数据时,我希望其他元素(例如工具栏)能够响应。示例代码如下,我发现对于每 100 个项目,工具栏会多一秒无响应。我的清单将超过 1000 项。
我尝试了一些性能建议,但无法正确调整。有什么建议吗?
我希望 'toolbar' 能够立即响应触摸。如果需要,我很乐意进行分页,但我想看看其他人是否对此进行了调整并提出了一些建议。
'use strict';
let _ = require('underscore');
let React = require('react-native');
let {Text, View, StyleSheet, TouchableHighlight, ListView, ScrollView} = React;
let Toolbar = React.createClass({
getInitialState: function () {
return {
isSearching: false
}
},
_onSearch: function () {
this.setState({ isSearching: true })
},
_onCancelSearch: function () {
this.setState({ isSearching: false })
},
render: function () {
let toSearchToolbar =
<TouchableHighlight
onPress={this._onSearch}>
<View>
<Text>Click to Search</Text>
</View>
</TouchableHighlight>
let searchingToolbar =
<TouchableHighlight
onPress={this._onCancelSearch}>
<View>
<Text>Cancel</Text>
</View>
</TouchableHighlight>
let toolbar = (this.state.isSearching) ? searchingToolbar : toSearchToolbar;
return toolbar;
}
});
let List = React.createClass({
propTypes: {
data: React.PropTypes.array.isRequired
},
getInitialState: function () {
var ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
return {
dataSource: ds.cloneWithRows(this.props.data),
};
},
_renderRow: function (rowData) {
return (
<View>
<Text>{rowData}</Text>
</View>
);
},
render: function () {
return (
<ScrollView>
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}
initialListSize={10}
scrollRenderAheadDistance={100}
removeClippedSubviews={true}
/>
</ScrollView>
);
},
});
let data = _.range(0, 1000).reverse()
let Main = React.createClass({
render: () => {
return (
<View style={styles.container}>
<Toolbar/>
<List data={data}/>
</View>
);
}
});
let styles = StyleSheet.create({
container: {
flex: 1
}
});
module.exports = Main
您可以尝试的一件事是使用 onChangeVisibleRows 回调来获取可见行的列表并仅呈现这些行中的内容。
使用最新版本的 React Native (< 0.14.0) 禁用 JS 开发模式。
- 在模拟器中通过摇一摇或 CTRL-M 打开设备菜单
- 开发设置
- 禁用 JS 开发模式
它执行。呼。
我有一个列表视图,正在加载大量数据。在加载数据时,我希望其他元素(例如工具栏)能够响应。示例代码如下,我发现对于每 100 个项目,工具栏会多一秒无响应。我的清单将超过 1000 项。
我尝试了一些性能建议,但无法正确调整。有什么建议吗?
我希望 'toolbar' 能够立即响应触摸。如果需要,我很乐意进行分页,但我想看看其他人是否对此进行了调整并提出了一些建议。
'use strict';
let _ = require('underscore');
let React = require('react-native');
let {Text, View, StyleSheet, TouchableHighlight, ListView, ScrollView} = React;
let Toolbar = React.createClass({
getInitialState: function () {
return {
isSearching: false
}
},
_onSearch: function () {
this.setState({ isSearching: true })
},
_onCancelSearch: function () {
this.setState({ isSearching: false })
},
render: function () {
let toSearchToolbar =
<TouchableHighlight
onPress={this._onSearch}>
<View>
<Text>Click to Search</Text>
</View>
</TouchableHighlight>
let searchingToolbar =
<TouchableHighlight
onPress={this._onCancelSearch}>
<View>
<Text>Cancel</Text>
</View>
</TouchableHighlight>
let toolbar = (this.state.isSearching) ? searchingToolbar : toSearchToolbar;
return toolbar;
}
});
let List = React.createClass({
propTypes: {
data: React.PropTypes.array.isRequired
},
getInitialState: function () {
var ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
return {
dataSource: ds.cloneWithRows(this.props.data),
};
},
_renderRow: function (rowData) {
return (
<View>
<Text>{rowData}</Text>
</View>
);
},
render: function () {
return (
<ScrollView>
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}
initialListSize={10}
scrollRenderAheadDistance={100}
removeClippedSubviews={true}
/>
</ScrollView>
);
},
});
let data = _.range(0, 1000).reverse()
let Main = React.createClass({
render: () => {
return (
<View style={styles.container}>
<Toolbar/>
<List data={data}/>
</View>
);
}
});
let styles = StyleSheet.create({
container: {
flex: 1
}
});
module.exports = Main
您可以尝试的一件事是使用 onChangeVisibleRows 回调来获取可见行的列表并仅呈现这些行中的内容。
使用最新版本的 React Native (< 0.14.0) 禁用 JS 开发模式。
- 在模拟器中通过摇一摇或 CTRL-M 打开设备菜单
- 开发设置
- 禁用 JS 开发模式
它执行。呼。