關(guān)于react子組建state初始化值為父組建傳來的props問題

問: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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作為一個合格的開發(fā)者,不要只滿足于編寫了可以運行的代碼。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個周閱讀 8,679評論 1 33
  • 前言 組件中的state具體是什么?怎么更改state的數(shù)據(jù)? setState函數(shù)分別接收對象以及函數(shù)有什么區(qū)別...
    itclanCoder閱讀 1,023評論 0 0
  • 40、React 什么是React?React 是一個用于構(gòu)建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,191評論 0 1
  • 前面提過react中的state和props是react組件中的兩大部分,有很多人分不清state和props,這...
    DCbryant閱讀 18,098評論 0 11
  • 起步 安裝官方腳手架: npm install -g create-react-app 創(chuàng)建項目: create-...
    Twoold閱讀 1,556評論 0 0

友情鏈接更多精彩內(nèi)容