React方向:16.x舊版本的生命周期函數(shù)的作用

1、組件的掛載階段(只會執(zhí)行一次)

讀取props以及初始化state狀態(tài)、自定義屬性以及方法,使用構(gòu)造函數(shù)construct()献汗,加載的時候調(diào)用一次,可以初始化state

import React, {Component} from "react"

export default class Cycle extends Component {
    // 1王污、初始化階段[數(shù)據(jù)的掛載罢吃、函數(shù)的定義聲明]
    constructor(){
        super()
        this.state = {
            msg:'舊版本的生命周期'
        }
    }
}
組件將要掛載的時候觸發(fā)的函數(shù):componentWillMount()

組件加載時只調(diào)用,之后組件更新不再調(diào)用昭齐,整個生命周期只會調(diào)用一次尿招,此時可以去修改狀態(tài)state中的數(shù)據(jù)。

    componentWillMount(){
        //修改數(shù)據(jù)
    }
render()函數(shù)渲染組件

創(chuàng)建虛擬DOM司浪,進(jìn)行diff算法泊业,更新DOM樹都在此時進(jìn)行把沼。


    render(){
        return (
            <>
                <h1>{this.state.msg}</h1>
            </>
        )
    }
掛載完成觸發(fā)函數(shù)

render()函數(shù)渲染完組件后觸發(fā)啊易,而且只會觸發(fā)一次,在進(jìn)行服務(wù)端渲染時是不會觸發(fā)的饮睬。
這個生命周期的主要功能類似于window.onload租谈,可以在這個生命周期函數(shù)中去操作DOM,以及去請求后臺的數(shù)據(jù)接口等操作。

    componentDidMount(){
        // 請求后臺數(shù)據(jù)
        // 操作DOM
    }

2割去、組件更新階段

父組件改變props傳值時窟却,子組件觸發(fā)數(shù)據(jù)更新函數(shù)componentWillReceiveProps()
    // 修改數(shù)據(jù)的生命周期函數(shù)
    componentWillReceiveProps(nextProps, nextContent) {
        console.log('觸發(fā)數(shù)據(jù)更新函數(shù):', nextProps, nextContent);
    }
父組件.png

子組件.png

image.png
是否要更新數(shù)據(jù)時觸發(fā)的函數(shù):shouldComponentUpdate()

shouldComponentUpdate(nextProps, nextState),要返回bool值呻逆,組件接收到新的props或者state時調(diào)用夸赫,就會更新dom(使用diff算法更新),return false 能阻止更新(不調(diào)用render)

    // 是否要更新數(shù)據(jù)觸發(fā)的函數(shù)咖城,返回boolean類型
    shouldComponentUpdate(nextProps,nextState){
        return false; //設(shè)為false將不再更新dom
    }
image.png
將要更新數(shù)據(jù)時觸發(fā)的函數(shù):componentWillUpdate(nextProps, nextState)

組件加載時不調(diào)用茬腿,只有在組件將要更新時才調(diào)用,此時可以修改state

    componentWillUpdate(nextProps, nextState){
        //組件更新時調(diào)用
    }
render()函數(shù)再次重新調(diào)起渲染組件宜雀,此時是更新DOM樹

創(chuàng)建虛擬dom切平,進(jìn)行diff算法,更新dom樹辐董。

數(shù)據(jù)更新完成時觸發(fā)的函數(shù):componentDidUpdate(nextProps, nextState)
    componentDidUpdate(nextProps, nextState){
        // 組件更新完成后執(zhí)行的生命周期函數(shù)
    }

3悴品、組件卸載階段

組件將要銷毀時觸發(fā)的函數(shù):componentWillUnmount()

組件渲染之后調(diào)用,只調(diào)用一次简烘,切換頁面時苔严,上個頁面被銷毀時觸發(fā),卸載過程只涉及一個函數(shù)孤澎,當(dāng)React組件要從DOM樹上刪除前邦蜜,會調(diào)用一次這個函數(shù)。這個函數(shù)經(jīng)常用于去除componentDidMount函數(shù)帶來的副作用亥至,例如清除計時器悼沈、刪除componentDidMount中創(chuàng)造的非React元素。
父組件:

    constructor(){
        super()
        this.state = {
            isShow:true,
        }
    }

    // 卸載子組件
    handleRemove = () => {
        const { isShow } = this.state;
        this.setState({
            isShow : !isShow
        })
    }

render(){
        return (
            <>
                <button onClick={this.handleRemove}>卸載子組件</button>
                { this.state.isShow && <Subcom list={this.state.arr} /> }
            </>
        )
    }

子組件:

    componentWillUnmount(){
        console.log('子組件已被卸載');
    }

4姐扮、測試完整代碼

父組件:

import React, {Component} from "react"

// 引入子組件
import Subcom from "./Subcom"
export default class Cycle extends Component {
    // 1絮供、初始化階段[數(shù)據(jù)的掛載、函數(shù)的定義聲明]
    constructor(){
        super()
        this.state = {
            msg:'舊版本的生命周期',
            arr:['a','b','c','d','e','f'],
            isShow:true,
        }
    }

    componentWillMount(){
        //修改數(shù)據(jù)
    }

    // 添加數(shù)據(jù)
    handleAdd = () => {
        const { arr } = this.state;
        arr.push(Math.floor(Math.random()*10)+1); // 加個隨機(jī)數(shù)
        this.setState({
            arr
        })
    }

    // 卸載子組件
    handleRemove = () => {
        const { isShow } = this.state;
        this.setState({
            isShow : !isShow
        })
    }


    render(){
        return (
            <>
                <h1>{this.state.msg}</h1>
                <button onClick={this.handleAdd}>添加數(shù)據(jù)</button>
                <button onClick={this.handleRemove}>卸載子組件</button>
                <br/>
                <br />
                <br />
                <br />
                { this.state.isShow && <Subcom list={this.state.arr} /> }
            </>
        )
    }

    componentDidMount(){
        // 請求后臺數(shù)據(jù)
        // 操作DOM
    }
}

子組件:

import React, { Component } from "react"

export default class Subcom extends Component {

    // 修改數(shù)據(jù)的生命周期函數(shù)
    componentWillReceiveProps(nextProps, nextContent) {
        console.log('觸發(fā)數(shù)據(jù)更新函數(shù):', nextProps, nextContent);
    }

    // 是否要更新數(shù)據(jù)觸發(fā)的函數(shù)茶敏,返回boolean類型
    shouldComponentUpdate(nextProps,nextState){
        return false;
    }

    componentWillUpdate(nextProps, nextState){
        //組件更新時調(diào)用
    }

    render() {
        const { list } = this.props;
        return (
            <>
                <ul>
                    {
                        list.map((item, index) => {
                            return <li key={index}>{item}</li>
                        })
                    }
                </ul>
            </>
        )
    }

    componentDidUpdate(nextProps, nextState){
        // 組件更新完成后執(zhí)行的生命周期函數(shù)
    }

    componentWillUnmount(){
        console.log('子組件已被卸載');
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壤靶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惊搏,更是在濱河造成了極大的恐慌贮乳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恬惯,死亡現(xiàn)場離奇詭異向拆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酪耳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門浓恳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事颈将∩液唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵晴圾,是天一觀的道長颂砸。 經(jīng)常有香客問我,道長死姚,這世上最難降的妖魔是什么沾凄? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮知允,結(jié)果婚禮上撒蟀,老公的妹妹穿的比我還像新娘。我一直安慰自己温鸽,他們只是感情好保屯,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涤垫,像睡著了一般姑尺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝠猬,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天切蟋,我揣著相機(jī)與錄音,去河邊找鬼榆芦。 笑死柄粹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匆绣。 我是一名探鬼主播驻右,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崎淳!你這毒婦竟也來了堪夭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拣凹,失蹤者是張志新(化名)和其女友劉穎森爽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚣镜,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爬迟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祈惶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕旨。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡扮匠,死狀恐怖捧请,靈堂內(nèi)的尸體忽然破棺而出凡涩,到底是詐尸還是另有隱情,我是刑警寧澤疹蛉,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布活箕,位于F島的核電站,受9級特大地震影響可款,放射性物質(zhì)發(fā)生泄漏育韩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一闺鲸、第九天 我趴在偏房一處隱蔽的房頂上張望筋讨。 院中可真熱鬧,春花似錦摸恍、人聲如沸悉罕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壁袄。三九已至,卻和暖如春媚媒,著一層夾襖步出監(jiān)牢的瞬間嗜逻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工缭召, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留栈顷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓嵌巷,卻偏偏與公主長得像妨蛹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晴竞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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