修改数据后,setState不会触发重新渲染
setState not triggering a re-render when data has been modified
刚刚开始使用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的渲染函数包装在中,但由于它在初始渲染时渲染得非常好,我认为这是一个可接受的包装。
经过一些测试,似乎重新渲染了父视图,但没有渲染子视图(它们基于父视图中更新的数据)。
JSfiddle:https://jsfiddle.net/zfenub6f/1/
我认为问题可能是您只将getInitialState
用于Row
。您正在使用传入的道具设置状态。如果孩子们得到了新道具,getInitialState
就不会再被召唤了。我总是提到https://facebook.github.io/react/docs/component-specs.html看看所有的生命周期事件。请尝试使用componentWillReceiveProps(object nextProps)
重新设置状态。如果您实际上不需要在子级中使用state
,请删除state的使用,只使用props
,它可能会起作用。
如果你的孩子正在使用State,而State没有更新,那么道具呢?那感觉还好吗?如果父项更改了子项的状态,而子项没有反映出这种更改,则这些子组件很可能需要为其分配一个唯一的密钥,该密钥告诉React在父项上更新状态时需要更新这些项。我遇到了一个类似的问题,子对象中的道具会更新以反映父对象,但子对象的状态不会更新。添加密钥后,解决方案就解决了。想要进一步阅读这个博客,请查看这个博客,它最初向我暗示了这个问题。
http://blog.arkency.com/2014/10/react-dot-js-and-dynamic-children-why-the-keys-are-important/
React的官方文件也解释了这种情况。
http://facebook.github.io/react/docs/multiple-components.html#dynamic-children
- 如何强制对模态进行新渲染
- 当以表单形式提交时,是否可以在PHP中访问新的数据* HTML5 / Javascript值?
- jQuery没有't返回新的数据属性
- 渲染数据来自/到 Javascript/jQuery
- 如何使用 Handlebars 和 jQuery 渲染数据
- 显示离子加载器在NG重复渲染数据的过程之间
- 如何使用angularjs在剑道网格中渲染数据
- iCanHaz.js+胡子没有't渲染数据对象中的第一行
- 用新的数据销毁方法或reloadChildren重新加载dynatree似乎不起作用
- Undercore模板不是't使用Backbone.js进行渲染数据不是't传递到模板
- 如何在电子邮件中渲染数据到图表
- 关注标签触发模糊事件后新渲染的文本输入
- 在ReactJS中渲染数据
- Angular.js在控制器中渲染数据
- 如何刷新我的项目列表在winapp当我插入一个新的数据在sqlite (javascript &html)
- 如果有新的数据,则停止重复插入
- Javascript HighCharts改变数据,而不是添加新的数据
- 在第一个模板渲染时没有渲染数据数组
- 等待执行功能,直到新的数据反映在浏览器中
- highcharts:当添加新的数据系列时,如果标题与现有的Y轴不同,则添加新的Y轴