我最近想升级我对React的了解,所以我从组件生命周期方法开始。让我感到好奇的第一件事是componentWillReceiveProps
。因此,文档说当组件接收新的(不一定更新的)道具时会被解雇。在该方法中,我们可以比较它们并在需要时保存到状态。
我的问题是:为什么我们需要该方法,如果该组件的道具更改(在父render
内)将触发重新呈现此子组件?
答案 0 :(得分:4)
一个常见的用例是响应更新的道具可能需要的状态(this.state
)更新。
由于您不应尝试通过this.setState()
函数中的render
更新组件的状态,因此需要在componentWillReceiveProps
中进行。
答案 1 :(得分:1)
此外,如果某些道具被用作某些获取功能的参数,您应该在<g>
中观察此道具,以使用新参数重新获取数据。
通常componentWillReceiveProps
用作触发获取某些数据的方法的地方。但是,如果您的容器(例如,UserData未卸载并且您更改componentDidMount
道具),则容器需要为相应的userId获取用户的数据。
userId
这不是一个完整的例子。让我们假设 class UserData extends Component {
componentDidMount() {
this.props.getUser(this.props.userId);
}
componentWillReceiveProps(nextProps) {
if (this.props.userId !== nextProps.userid) {
this.props.getUser(nextProps.userId);
}
}
render() {
if (this.props.loading) {
return <div>Loading...</div>
}
return <div>{this.user.firstName}</div>
}
}
派遣Redux操作和Redux分配给组件getUser
,user
和loading
道具。
答案 2 :(得分:1)
它服务&#39;作为一个机会来对传入的道具做出反应,以便在渲染之前设置应用程序的状态。如果您在渲染后调用setState将无限重新渲染,这就是您不允许这样做的原因,因此您可以使用componentWillReceiveProps。
但是...... 你在混乱中超出了正确程度,所以事实上他们正在弃用它以及其他Will-lifecycle hook Discussion Deprecation。
this.state.someState = someValue
的引用,这将完成所有事情而不是重新渲染组件无限循环。答案 3 :(得分:0)
该组件的道具更改(在父级渲染内)将触发重新渲染此子组件
你是对的。如果需要对这些更改做出反应,则只需使用此方法。例如,您可能在子组件中具有使用多个道具计算的状态。
小例子:
class Test extends Component {
state = {
modified: "blank"
};
componentDidMount(){
this.setState({
modified: `${this.props.myProp} isModified`
});
}
componentWillReceiveProps(nextProps) {
this.setState({
modified: `${nextProps.myProp} isModified`
});
}
render() {
return <div className="displayed">{this.state.modified}</div>
}
}
在此示例中,componentDidMount
使用this.props
设置状态。当此组件收到新道具时,如果没有componentWillReceiveProps
,则this.state.modified
将永远不会再次更新。
当然,您可以在渲染方法中执行{this.props.myProp + "IsModified"}
,但是当您需要更新道具更改componentWillReceiveProps
时,this.state
非常有用。
答案 4 :(得分:0)
使用this作为通过使用this.setState()更新状态来调用render()之前对prop转换作出反应的机会。可以通过this.props访问旧道具。在此函数中调用this.setState()不会触发额外的渲染。
看看这个article
答案 5 :(得分:0)
componentWillReceiveProps
将始终作为参数收到&#34; NxtProps
&#34;,在componentWillReceiveProps
之后调用render()
。
有些人使用此方法使用此方法比较nxtProps
和this.props
,以检查是否应在组件调用render
之前发生某些事情,以及某些验证。
查看react的文档,了解更多有关反应生命周期的信息!
希望这可以帮到你!