反应文档提到对setState
的调用已排队,并且不会立即发生。在下一个组件呈现之前,反应是否会在setState
内排队componentWillReceiveProps
的任何保证?这些场景中的任何一种都比其他场景更可能吗?
道具变更> componentWillReceiveProps调用> setState enqueued> setState运行>渲染(包括新状态)
道具变更> componentWillReceiveProps调用> setState enqueued>渲染> setState运行>重新呈现
或者,这两种情况都同样可能吗?当setState相对于组件生命周期方法运行时,React没有做出任何保证吗?
以下是我的示例的ES2015代码摘录:
import React from 'react';
class Widget extends React.Component {
componentWillReceiveProps() {
this.setState({foo: 'bar'});
}
render() {
return <div>
<a onClick={(e) => {
e.preventDefault();
this.props.triggerExternalPropsChange();
}}>
Click me to trigger new props
</a>
</div>;
}
}
triggerExternalPropsChange
将新道具传递给Widget
组件。
答案 0 :(得分:24)
componentWillReceiveProps
存在的唯一原因是为组件提供了setState
的机会。所以,是的,你在其中同步设置的任何状态都将与新道具一起处理。在这种情况下,不会有两个渲染,只有一个渲染。
答案 1 :(得分:0)
shouldComponentUpdate
你可以检查并等到渲染之前更新道具和状态。
答案 2 :(得分:0)
它是1.
在componentWillReceiveProps()中调用setState()是在组件呈现之前执行状态更新的意义上的异常,因此您将在同一渲染中同时应用props更改和状态更改。