【发布时间】:2015-06-10 03:44:18
【问题描述】:
刚开始使用 React,到目前为止进展相对顺利。
我有一个列表,其中包含 X 个预定义项,这意味着该列表始终以给定数量的行呈现。
此数据是在列表呈现之前从 REST API 收集的。数据包含与列表相关的变量,以及包含列表中每个项目的数组。
我选择了简单的方法,因此我用一个名为“data”的 JSON 对象填充每个组件,该对象包含所有必要的内容。
渲染列表看起来像这样:
<MyList data={data} />
那么,在MyList的getInitialState中:
dataInt: this.props.data.dataInt || 0,
dataStr: this.props.data.dataStr || '',
rows: this.props.data.rows || []
所以我将我的项目数组(JSON)存储在列表(父)的初始状态中,当我选择渲染列表时,我首先在一个数组中创建所有组件(子),如下所示:
var toRender = [];
for(i = 0; i < this.state.rows.length; i++) {
toRender.push(<ItemRow data={this.state.rows[i]} />);
}
然后我像这样渲染:
return (
<div className="item-container">
<table className="item-table">
{toRender}
</table>
</div>
);
MyItem 的渲染函数如下所示:
return (
<tr>
<td>{this.state.dataFromItem}</td>
</tr>
);
现在,假设我想使用我刚刚从 API 获得的一些新数据从父级中修改子级数据。相同的结构,只是一个字段/列的值发生了变化:
i = indexOfItemToBeUpdated;
var newRows = this.state.rows;
newRows[i] = data; // New JSON object with same keys, different values.
this.setState({ rows: newRows }); // Doesn't trigger re-render
this.forceUpdate(); // Doesn't trigger re-render
我做错了什么?
起初我以为是因为我将 MyItem 的渲染函数包装在 a 中,但由于它在初始渲染时渲染得非常好,我会假设这是一个可接受的包装器。
经过一些测试,似乎重新渲染了父视图,而不是子视图(基于父视图中更新的数据)。
JSfiddle:https://jsfiddle.net/zfenub6f/1/
【问题讨论】:
-
你能不能把它放在一个 jsfiddle 或类似的东西中,因为你不清楚你的实际结构是什么或者这些部分是如何交互的,因为你只包含了一些 sn-ps 代码。
-
自发布以来我做了一些更改,但同样的问题仍然存在:jsfiddle.net/zfenub6f/1
-
您能否将其最小化为具体问题并使其真正发挥作用?那里有很多代码,它在 jsfiddle 上不起作用。您可能只需要为每一行添加一个“键”。 facebook.github.io/react/docs/…
标签: javascript json reactjs setstate