react-native:ListView,如何从顶部推送新行

Aka*_*bab 7 ios react-native

我一直试图了解如何设法制作一个可以接收新数据并将其推送到前面的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);
Run Code Online (Sandbox Code Playgroud)

然后我试过:

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),
    });
  },
Run Code Online (Sandbox Code Playgroud)

这实际上有效,但我不明白为什么第一种方法不起作用.我试图找出使用ListView处理的最佳实践:

  • 我是否应该在任何情况下使用带有新数组的cloneWithRows,即使是单个添加/删除操作?
  • 还有什么可以设置ListView/DataSource机制,以最小的重绘(键,hasRowChanged特定的比较?),

有点缺乏文件和例子,为我和任何人澄清它会很棒.谢谢你,并有一个很好的代码日.

小智 3

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

注意:该组件不是通用的,如果没有定义 id 属性将会失败。

注意:我意识到这并不能回答您的整个问题,只是在数据源前面添加一个特定的特殊性。