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 处理的最佳做法是什么:

有点缺乏文档和示例,如果能为我和任何人澄清一下就好了。谢谢你,祝你代码日愉快。

ListView 通过数据源索引分配组件键,因此只要数据源被添加到前面,就会重新呈现所有行。如果您的行数据有任何唯一 ID,您可以创建一个修改后的 ListView,将其用作键。请参阅 PrependableListView 示例,它将在您的行数据上使用 id 属性。

注意:此组件未通用化,如果未定义 id 属性 将失败。

注意:我知道这并没有回答你的全部问题,只是关于在数据源前添加的特定特性。