react-native:ListView,如何从顶部推送新行
react-native: ListView, how to push new rows from top
我一直在努力了解如何设法制作一个可以经常接收新数据并将其推送到前端的 ListView。使用下面的代码,列表不能正确反映更改,而不是在顶部有一个新行,最后一行被复制..
'use strict';
var React = require('react-native');
var {
AppRegistry,
StyleSheet,
Text,
View,
ListView,
TouchableHighlight,
} = React;
var listview = React.createClass({
rows: [],
_rowHasChanged: function (r1, r2) {
// if (r1 !== r2)
// console.log('rowChanged', r1, r2);
// else
// console.log('row didn\'t Changed', r1, r2);
return r1 !== r2;
},
getInitialState: function() {
return {
dataSource: new ListView.DataSource({rowHasChanged: this._rowHasChanged}),
};
},
componentDidMount: function () {
this.rows = [
{id: 0, text: '0: text'},
{id: 1, text: '1: text'},
{id: 2, text: '2: text'},
{id: 3, text: '3: text'},
];
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.rows),
});
},
pushTopRow: function () {
var id = this.rows.length;
this.rows.unshift({id: id, text: id + ': text'});
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.rows),
});
},
render: function() {
return (
<View style={styles.container}>
<ListView
dataSource={this.state.dataSource}
renderRow={(rowData) => <Text key={rowData.id}>{rowData.text}</Text>}
/>
<TouchableHighlight
onPress={this.pushTopRow}>
<Text>PUSH TOP</Text>
</TouchableHighlight>
</View>
);
},
});
var styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: 'orange',
},
});
AppRegistry.registerComponent('listview', () => listview);
然后我尝试了:
pushTopRow: function () {
var id = this.rows.length;
var newRow = [{id: id, text: id + ': text'}];
this.rows = newRow.concat(this.rows);
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.rows),
});
},
这确实有效,但我不明白为什么第一种方法不起作用。我试图弄清楚使用 ListView 处理的最佳做法是什么:
- 我是否应该在任何情况下都将 cloneWithRows 与新数组一起使用,即使
对于单个 add/delete 操作 ?
- 是否还有其他设置可以使 ListView/DataSource 机制在最少重绘的情况下正常工作(键,hasRowChanged
具体对比?),
有点缺乏文档和示例,如果能为我和任何人澄清一下就好了。谢谢你,祝你代码日愉快。
ListView 通过数据源索引分配组件键,因此只要数据源被添加到前面,就会重新呈现所有行。如果您的行数据有任何唯一 ID,您可以创建一个修改后的 ListView,将其用作键。请参阅 PrependableListView 示例,它将在您的行数据上使用 id 属性。
注意:此组件未通用化,如果未定义 id 属性 将失败。
注意:我知道这并没有回答你的全部问题,只是关于在数据源前添加的特定特性。
我一直在努力了解如何设法制作一个可以经常接收新数据并将其推送到前端的 ListView。使用下面的代码,列表不能正确反映更改,而不是在顶部有一个新行,最后一行被复制..
'use strict';
var React = require('react-native');
var {
AppRegistry,
StyleSheet,
Text,
View,
ListView,
TouchableHighlight,
} = React;
var listview = React.createClass({
rows: [],
_rowHasChanged: function (r1, r2) {
// if (r1 !== r2)
// console.log('rowChanged', r1, r2);
// else
// console.log('row didn\'t Changed', r1, r2);
return r1 !== r2;
},
getInitialState: function() {
return {
dataSource: new ListView.DataSource({rowHasChanged: this._rowHasChanged}),
};
},
componentDidMount: function () {
this.rows = [
{id: 0, text: '0: text'},
{id: 1, text: '1: text'},
{id: 2, text: '2: text'},
{id: 3, text: '3: text'},
];
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.rows),
});
},
pushTopRow: function () {
var id = this.rows.length;
this.rows.unshift({id: id, text: id + ': text'});
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.rows),
});
},
render: function() {
return (
<View style={styles.container}>
<ListView
dataSource={this.state.dataSource}
renderRow={(rowData) => <Text key={rowData.id}>{rowData.text}</Text>}
/>
<TouchableHighlight
onPress={this.pushTopRow}>
<Text>PUSH TOP</Text>
</TouchableHighlight>
</View>
);
},
});
var styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: 'orange',
},
});
AppRegistry.registerComponent('listview', () => listview);
然后我尝试了:
pushTopRow: function () {
var id = this.rows.length;
var newRow = [{id: id, text: id + ': text'}];
this.rows = newRow.concat(this.rows);
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.rows),
});
},
这确实有效,但我不明白为什么第一种方法不起作用。我试图弄清楚使用 ListView 处理的最佳做法是什么:
- 我是否应该在任何情况下都将 cloneWithRows 与新数组一起使用,即使 对于单个 add/delete 操作 ?
- 是否还有其他设置可以使 ListView/DataSource 机制在最少重绘的情况下正常工作(键,hasRowChanged 具体对比?),
有点缺乏文档和示例,如果能为我和任何人澄清一下就好了。谢谢你,祝你代码日愉快。
ListView 通过数据源索引分配组件键,因此只要数据源被添加到前面,就会重新呈现所有行。如果您的行数据有任何唯一 ID,您可以创建一个修改后的 ListView,将其用作键。请参阅 PrependableListView 示例,它将在您的行数据上使用 id 属性。
注意:此组件未通用化,如果未定义 id 属性 将失败。
注意:我知道这并没有回答你的全部问题,只是关于在数据源前添加的特定特性。