Я создал компонент React, который отображает набор подэлементов, заданных массивом идентификаторов. Массив идентификаторов хранится в состоянии родительского компонента, а затем я запускаю некоторые вызовы ajax на основе идентификаторов для извлечения данных для рендеринга. Полученные данные сохраняются в отдельном массиве данных в состоянии. Представленные компоненты используют ключ id.
Иды могут изменяться в зависимости от действий вне компонента, поэтому я использую setState для компонента для замены массива. Обновленное состояние id, вероятно, будет содержать некоторые из тех же идентификаторов, что и в исходном массиве. В то же время я опуская "массив данных", чтобы все снова отображалось.
Когда я это делаю, я иногда получаю предупреждение-ключ:
Предупреждение: flattenChildren (...): Встречались двое детей с одинаковыми ключ. Детские ключи должны быть уникальными; когда двое детей делят ключ, только будет использоваться первый ребенок.
Новый массив не содержит дубликатов. Так почему это происходит, и что я могу сделать, чтобы этого избежать?
Изменить: добавлен код по запросу. Примечание. Я использую модуль бесконечной прокрутки. Может ли это быть причиной этого?
Начальное состояние:
getInitialState: function() {
return {
hasMore: true,
num: 0,
movieIds: this.props.movieIds,
movies: []
};
},
Функция рендеринга:
render: function() {
var InfiniteScroll = React.addons.InfiniteScroll;
return (
<InfiniteScroll
pageStart={0}
loadMore={this.loadMore}
threshold='20'
hasMore={this.state.hasMore}>
<ul className="movieList">
{this.state.movies}
</ul>
</InfiniteScroll>
);
}
Упрощенная нагрузка больше:
comp = this;
$.ajax( {
url: url,
contentType: "json",
success: function (data) {
var m = createMovieLi(data);
var updatedMovies = comp.state.movies;
updatedMovies[num] = m;
comp.setState({movies: updatedMovies});
}
});
И наконец, при обновлении вне компонента:
movieBox.setState({
hasMore: true,
num: 0,
movieIds: filteredIds,
movies: []
});