【发布时间】:2014-11-23 04:35:39
【问题描述】:
我创建了一个 React 组件,它在给定 id 数组的情况下呈现一组子元素。 ids 数组保持在父组件的状态,然后我根据 ids 运行一些 ajax 调用来获取要渲染的数据。获取的数据存储在状态中的单独数据数组中。渲染的组件使用 id 作为键。
id 可以根据组件外部的操作而改变,所以我在组件上使用 setState 来替换数组。 更新后的 id-state 可能包含一些与原始数组中相同的 id。 同时我清空了“数据数组”,以便再次渲染所有内容。
当我这样做时,有时会收到关键警告:
警告:flattenChildren(...): 遇到两个相同的孩子 钥匙。子键必须是唯一的;当两个孩子共用一把钥匙时,只有 将使用第一个孩子。
新数组不包含任何重复项。那么为什么会发生这种情况,我该怎么做才能避免这种情况呢?
编辑:应要求添加了一些代码。注意:我使用的是Infinite Scroll module。会不会是这个原因?
初始状态:
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: []
});
【问题讨论】:
-
给出一个显示问题的最小代码示例。这可能是一个简单的修复,但完全取决于您的代码。
标签: reactjs