ListView удаляет неправильную строку при обновлении источника данных

У меня есть React Native ListView, который, кажется, удаляет неправильную строку в пользовательском интерфейсе, когда я обновляю состояние новыми разделами и строками. Удаленная строка остается, но та, которая иногда или даже 2, удаляется, пока я перезагрузите приложение.

Что я делаю неправильно?

constructor(props) {
  super(props)

  this.state = {
    dataState: DataState.STATE_NOT_LOADED,
    dataSource: new ListView.DataSource({
      rowHasChanged: (r1, r2) => r1.identifier !== r2.identifier,
      sectionHeaderHasChanged: (s1, s2) => s1 !== s2
    })
  };
}

componentDidMount() {
  this.loadData();
}

loadData() {
  this.setState({
    dataState: DataState.STATE_LOADING
  });

  User.getDocs()
    .bind(this)
    .then(results => {
      var docs = _.groupBy(results, function (d) {
        return d.createdAt.format('MMMM D');
      });

      this.setState({
        dataState: DataState.STATE_LOADED,
        dataSource: this.state.dataSource.cloneWithRowsAndSections(docs)
      });
    })
    .catch(error => {
      console.log(error);

      this.setState({
        dataState: DataState.STATE_ERROR
      });
    });
}

onTrackPressed(doc) {
  User.untrackDoc(doc)
    .bind(this)
    .tap(() => {
      this.loadData();
    });
}

renderRow(result) {
  return (
    <DocRow
      style={styles.row}
      doc={result}
      tracked={true}
      onPress={() => this.onRowPressed(result)}
      onTrackPress={() => this.onTrackPressed(result)}/>
  );
}

1 ответ

Я не уверен, что это правильный ответ, но он работал для меня, пока я не смогу найти лучшее объяснение / лучший ответ.

У меня недавно был такой же вопрос, как и с кем-то, с кем я разговаривал. Они исправили это, добавив ключевое свойство в ListView. По-видимому, вам нужно добавить ключ в ListView, потому что строки таблицы являются супер динамическими, и кажется, что отсутствие ключа в каждой строке заставляло ListView неправильно выбирать, какую строку удалять.

<ListView
  key={putSomethingUniqueInHere}
  dataSource={this.state.dataSource}
  renderRow={this.renderRow.bind(this)}
/>
Другие вопросы по тегам