ReactJS:操纵状态不能正确呈现子组件
ReactJS : Manipulating State doesn't render child components properly
我有三个组件 "MyApp"、"Candidate" 和 "Courses",数据从 MyApp 传递到 Courses。
数据是这样的
var data = [{
name : "azhar",
courses : ["Compilers", "Algorithms", "Data Structures"]
}, {
name : "Jenny",
courses : ["Design", "UX"]
}];
ReactComponents 如下所示:
<MyApp>
<Candidate>
<Courses>
<Courses>
<Courses>
</Candidate>
</MyApp>
问题:有一个添加新候选人的按钮,单击时我将新候选人添加到 MyApp 的状态。单击时我看到子组件未呈现正确的数据。
添加了 JSFiddle:https://jsfiddle.net/69z2wepo/8587/
真的希望有人给出一个好的解释,因为这是一个简单的用例。
谢谢
我不认为直接使用 react.state 是个好主意,就像你在这里做的那样:
this.state.data.unshift({
name : "Alice",
courses : [] // No courses for her.
});
最好使用这样的附加变量:
var candidates = this.state.data;
candidates.push({
name : "Alice",
courses : [] // No courses for her.
});
this.setState({
data : candidates
});
这是一个 JSFiidle:https://jsfiddle.net/69z2wepo/8597/
当您像使用 this.state.data.map()
一样创建 JSX 元素数组时,您应该始终包含一个 key
属性,该属性对于数组中的该位置是唯一的。请注意,它不应该是可以更改的内容,例如数组中的索引或候选人的姓名(因为可能会重复)。
如果您在候选对象上添加 id
属性,并在添加候选对象时创建一个新 ID,它应该可以工作:https://jsfiddle.net/qzy3sr6w/2/
这里有一个很好的解释:http://blog.arkency.com/2014/10/react-dot-js-and-dynamic-children-why-the-keys-are-important/
那个 post 的 TL;DR 是它对 push
但对 unshift
不起作用的原因是因为如果你不指定 key
, React 将使用数组的索引作为键(不完全正确,但足够接近)。由于您要添加到数组的开头,它将使用之前用于另一个组件的索引 0,这意味着新的第一个元素将获得第二个元素课程。
我有三个组件 "MyApp"、"Candidate" 和 "Courses",数据从 MyApp 传递到 Courses。 数据是这样的
var data = [{
name : "azhar",
courses : ["Compilers", "Algorithms", "Data Structures"]
}, {
name : "Jenny",
courses : ["Design", "UX"]
}];
ReactComponents 如下所示:
<MyApp>
<Candidate>
<Courses>
<Courses>
<Courses>
</Candidate>
</MyApp>
问题:有一个添加新候选人的按钮,单击时我将新候选人添加到 MyApp 的状态。单击时我看到子组件未呈现正确的数据。
添加了 JSFiddle:https://jsfiddle.net/69z2wepo/8587/
真的希望有人给出一个好的解释,因为这是一个简单的用例。
谢谢
我不认为直接使用 react.state 是个好主意,就像你在这里做的那样:
this.state.data.unshift({
name : "Alice",
courses : [] // No courses for her.
});
最好使用这样的附加变量:
var candidates = this.state.data;
candidates.push({
name : "Alice",
courses : [] // No courses for her.
});
this.setState({
data : candidates
});
这是一个 JSFiidle:https://jsfiddle.net/69z2wepo/8597/
当您像使用 this.state.data.map()
一样创建 JSX 元素数组时,您应该始终包含一个 key
属性,该属性对于数组中的该位置是唯一的。请注意,它不应该是可以更改的内容,例如数组中的索引或候选人的姓名(因为可能会重复)。
如果您在候选对象上添加 id
属性,并在添加候选对象时创建一个新 ID,它应该可以工作:https://jsfiddle.net/qzy3sr6w/2/
这里有一个很好的解释:http://blog.arkency.com/2014/10/react-dot-js-and-dynamic-children-why-the-keys-are-important/
那个 post 的 TL;DR 是它对 push
但对 unshift
不起作用的原因是因为如果你不指定 key
, React 将使用数组的索引作为键(不完全正确,但足够接近)。由于您要添加到数组的开头,它将使用之前用于另一个组件的索引 0,这意味着新的第一个元素将获得第二个元素课程。