問:React中通過props給子組件傳state值時,為什么當父組件setState后props不能同步更新?而當父組件再次setState時props值卻是這次修改前的state。
答:父組件傳遞給子組件的props發(fā)生改變,引發(fā)子組件的render,并沒有執(zhí)行子組件的constructor函數(shù),子組件沒有被卸載自然不會重新加載,只會重新render,而如果父組件的props傳遞給子組件的state,那么子組件的state只會在第一次加載的時候被賦值,后續(xù)的父組件props變化并不會被賦值到子組件的state上,還是要理解組件的聲明周期函數(shù),以及各個函數(shù)在什么時候會被調(diào)用。
擴展:
子組件顯示父組件穿過來的props有兩種方式:
1、直接使用
這種方式,父組件改變props后,子組件重新渲染,由于直接使用的props,所以我們不需要做什么就可以正常顯示最新的props
class Child extends Component {
render() {
return <div>{this.props.someThings}</div>
}
}
2、轉(zhuǎn)換成自己的state
這種方式,由于我們使用的是state,所以每當父組件每次重新傳遞props時,我們需要重新處理下,將props轉(zhuǎn)換成自己的state,這里就用到了 componentWillReceiveProps。
關(guān)于你提到的不會二次渲染是這樣的:每次子組件接收到新的props,都會重新渲染一次,除非你做了處理來阻止(比如使用:shouldComponentUpdate),但是你可以在這次渲染前,根據(jù)新的props更新state,更新state也會觸發(fā)一次重新渲染,但react不會這么傻,所以只會渲染一次,這對應(yīng)用的性能是有利的。
class Child extends Component {
constructor(props) {
super(props);
this.state = {
someThings: props.someThings
};
}
componentWillReceiveProps(nextProps) {
this.setState({someThings: nextProps.someThings});
}
render() {
return <div>{this.state.someThings}</div>
}
}
https://segmentfault.com/q/1010000008387645
https://segmentfault.com/q/1010000006019858