React組件生命周期(學習筆記)

常用的三個生命周期函數(shù):componentDidMount相种,render僵闯,componentWillUnmount

舊生命周期


image.png
  1. 初始化階段: 由ReactDOM.render()觸發(fā)---初次渲染
    1. constructor()
    1. componentWillMount()
    1. render()
    1. componentDidMount() =====> 常用
      一般在這個鉤子中做一些初始化的事,例如:開啟定時器淋叶、發(fā)送網(wǎng)絡請求、訂閱消息
  1. 更新階段: 由組件內(nèi)部this.setSate()或父組件render觸發(fā)
    1. shouldComponentUpdate()
    1. componentWillUpdate()
    1. render() =====> 必須使用的一個
    1. componentDidUpdate()
  1. 卸載組件: 由ReactDOM.unmountComponentAtNode()觸發(fā)
    1. componentWillUnmount() =====> 常用
      一般在這個鉤子中做一些收尾的事,例如:關閉定時器书聚、取消訂閱消息
<script type="text/babel">
    //創(chuàng)建組件
    class Count extends React.Component {

        //構造器
        constructor(props) {
            console.log('Count---constructor');
            super(props)
            //初始化狀態(tài)
            this.state = {count: 0}
        }

        //加1按鈕的回調
        add = () => {
            //獲取原狀態(tài)
            const {count} = this.state
            //更新狀態(tài)
            this.setState({count: count + 1})
        }

        //卸載組件按鈕的回調
        death = () => {
            ReactDOM.unmountComponentAtNode(document.getElementById('test'))
        }

        //強制更新按鈕的回調
        force = () => {
            this.forceUpdate()
        }

        //組件將要掛載的鉤子
        componentWillMount() {
            console.log('Count---componentWillMount');
        }

        //組件掛載完畢的鉤子
        componentDidMount() {
            console.log('Count---componentDidMount');
        }

        //組件將要卸載的鉤子
        componentWillUnmount() {
            console.log('Count---componentWillUnmount');
        }

        //控制組件更新的“閥門”(不寫shouldComponentUpdate的話react會默認返回true)
        shouldComponentUpdate() {
            console.log('Count---shouldComponentUpdate');
            return true
        }

        //組件將要更新的鉤子
        componentWillUpdate() {
            console.log('Count---componentWillUpdate');
        }

        //組件更新完畢的鉤子
        componentDidUpdate() {
            console.log('Count---componentDidUpdate');
        }

        render() {
            console.log('Count---render');
            const {count} = this.state
            return (
                <div>
                    <h2>當前求和為:{count}</h2>
                    <button onClick={this.add}>點我+1</button>
                    <button onClick={this.death}>卸載組件</button>
                    <button onClick={this.force}>不更改任何狀態(tài)中的數(shù)據(jù),強制更新一下</button>
                </div>
            )
        }
    }

    //父組件A
    class A extends React.Component {
        //初始化狀態(tài)
        state = {carName: '奔馳'}

        changeCar = () => {
            this.setState({carName: '奧拓'})
        }

        render() {
            return (
                <div>
                    <div>我是A組件</div>
                    <button onClick={this.changeCar}>換車</button>
                    <B carName={this.state.carName}/>
                </div>
            )
        }
    }

    //子組件B
    class B extends React.Component {
        //組件將要接收新的props的鉤子(第一次不會觸發(fā))
        componentWillReceiveProps(props) {
            console.log('B---componentWillReceiveProps', props);
        }

        //控制組件更新的“閥門”
        shouldComponentUpdate() {
            console.log('B---shouldComponentUpdate');
            return true
        }

        //組件將要更新的鉤子
        componentWillUpdate() {
            console.log('B---componentWillUpdate');
        }

        //組件更新完畢的鉤子
        componentDidUpdate() {
            console.log('B---componentDidUpdate');
        }

        render() {
            console.log('B---render');
            return (
                <div>我是B組件,接收到的車是:{this.props.carName}</div>
            )
        }
    }

    //渲染組件
    ReactDOM.render(<Count/>, document.getElementById('test'))
</script>

新生命周期


image.png
  1. 初始化階段: 由ReactDOM.render()觸發(fā)---初次渲染
    1. constructor()
    1. getDerivedStateFromProps
      很少用雌续,若state的值在任何時候都取決于props斩个,那么可以使用getDerivedStateFromProps
    1. render()
    1. componentDidMount() =====> 常用
      一般在這個鉤子中做一些初始化的事,例如:開啟定時器驯杜、發(fā)送網(wǎng)絡請求受啥、訂閱消息
  1. 更新階段: 由組件內(nèi)部this.setSate()或父組件重新render觸發(fā)
    1. getDerivedStateFromProps
    1. shouldComponentUpdate()
    1. render()
    1. getSnapshotBeforeUpdate
      很少用,在componentDidUpdate之前調用鸽心,可以在這里返回一個值(組件更新之前的值)滚局,在componentDidUpdate可以接收這個值。componentDidUpdate(preProps, preState, snapshotValue)
    1. componentDidUpdate()
  1. 卸載組件: 由ReactDOM.unmountComponentAtNode()觸發(fā)
    1. componentWillUnmount() =====> 常用
      一般在這個鉤子中做一些收尾的事再悼,例如:關閉定時器核畴、取消訂閱消息
<script type="text/babel">
    //創(chuàng)建組件
    class Count extends React.Component {

        //構造器
        constructor(props) {
            console.log('Count---constructor');
            super(props)
            //初始化狀態(tài)
            this.state = {count: 0}
        }

        //加1按鈕的回調
        add = () => {
            //獲取原狀態(tài)
            const {count} = this.state
            //更新狀態(tài)
            this.setState({count: count + 1})
        }

        //卸載組件按鈕的回調
        death = () => {
            ReactDOM.unmountComponentAtNode(document.getElementById('test'))
        }

        //強制更新按鈕的回調
        force = () => {
            this.forceUpdate()
        }

        //若state的值在任何時候都取決于props,那么可以使用getDerivedStateFromProps
        static getDerivedStateFromProps(props, state) {
            console.log('getDerivedStateFromProps', props, state);
            // return null
            return props
        }

        //在更新之前獲取快照
        getSnapshotBeforeUpdate() {
            console.log('getSnapshotBeforeUpdate');
            // 快照值可以是任意值
            return 'atguigu'
        }

        //組件掛載完畢的鉤子
        componentDidMount() {
            console.log('Count---componentDidMount');
        }

        //組件將要卸載的鉤子
        componentWillUnmount() {
            console.log('Count---componentWillUnmount');
        }

        //控制組件更新的“閥門”
        shouldComponentUpdate() {
            console.log('Count---shouldComponentUpdate');
            return true
        }

        //組件更新完畢的鉤子
        componentDidUpdate(preProps, preState, snapshotValue) {
            // 在這里可以接收到快照值冲九,然后做一些操作谤草。
            //比如在這里獲取元素的最新高度和傳進來的快照值(舊的高度),就可以計算出滾動距離莺奸。
            console.log('Count---componentDidUpdate', preProps, preState, snapshotValue);
        }

        render() {
            console.log('Count---render');
            const {count} = this.state
            return (
                <div>
                    <h2>當前求和為:{count}</h2>
                    <button onClick={this.add}>點我+1</button>
                    <button onClick={this.death}>卸載組件</button>
                    <button onClick={this.force}>不更改任何狀態(tài)中的數(shù)據(jù)丑孩,強制更新一下</button>
                </div>
            )
        }
    }

    //渲染組件
    ReactDOM.render(<Count count={199}/>, document.getElementById('test'))
</script>
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灭贷,隨后出現(xiàn)的幾起案子温学,更是在濱河造成了極大的恐慌,老刑警劉巖甚疟,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仗岖,死亡現(xiàn)場離奇詭異,居然都是意外死亡览妖,警方通過查閱死者的電腦和手機轧拄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讽膏,“玉大人檩电,你說我怎么就攤上這事「鳎” “怎么了俐末?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奄侠。 經(jīng)常有香客問我卓箫,道長,這世上最難降的妖魔是什么垄潮? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任丽柿,我火速辦了婚禮恢准,結果婚禮上,老公的妹妹穿的比我還像新娘甫题。我一直安慰自己馁筐,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布坠非。 她就那樣靜靜地躺著敏沉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炎码。 梳的紋絲不亂的頭發(fā)上盟迟,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音潦闲,去河邊找鬼攒菠。 笑死,一個胖子當著我的面吹牛歉闰,可吹牛的內(nèi)容都是我干的辖众。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼和敬,長吁一口氣:“原來是場噩夢啊……” “哼凹炸!你這毒婦竟也來了?” 一聲冷哼從身側響起昼弟,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤啤它,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舱痘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體变骡,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年芭逝,在試婚紗的時候發(fā)現(xiàn)自己被綠了塌碌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡铝耻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬刷,到底是詐尸還是另有隱情瓢捉,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布办成,位于F島的核電站泡态,受9級特大地震影響,放射性物質發(fā)生泄漏迂卢。R本人自食惡果不足惜某弦,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一桐汤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靶壮,春花似錦怔毛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至螃壤,卻和暖如春抗果,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奸晴。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工冤馏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寄啼。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓逮光,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辕录。 傳聞我的和親對象是個殘疾皇子睦霎,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容