国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

React Component Lifecycle

alphahans / 3421人閱讀

摘要:例如一個嬰兒在出生前和出生后,這是兩個不同的階段。主要是在更新前,最后一次修改,而不會觸發(fā)重新渲染。組件更新的整個過程控制臺打印第一個是初始化調(diào)用的,不是更新的過程。

概述

我們先來理一理React的生命周期方法有哪些:

componentWillMount

渲染前調(diào)用一次,這個時候DOM結(jié)構(gòu)還沒有渲染。

componentDidMount

渲染完成后調(diào)用一次,這個時候DOM結(jié)構(gòu)已經(jīng)渲染了。這個時候就可以初始化其他框架的設(shè)置了,如果利用jQuery綁定事件等等。

componentWillReceiveProps

初始化渲染不會調(diào)用,在接收到新的props時,會調(diào)用這個方法。

shouldComponentUpdate

初始化渲染不會調(diào)用,接收到新的props或state時調(diào)用。

componentWillUpdate

初始化渲染不會調(diào)用,更新前調(diào)用。

componentDidUpdate

初始化渲染不會調(diào)用,更新后調(diào)用。

componentWillUnmount

組件移除前調(diào)用。
根據(jù)執(zhí)行的時機,這些方法可以分為三類。

組件掛載

組件渲染前后會執(zhí)行,而且只會執(zhí)行一次,看個例子

var A = React.createClass({      
    componentWillMount: function () {            
        console.log("A componentWillMount");
    },
    componentDidMount: function () {
        console.log("A componentDidMount");
    },
    render: function () {
        console.log("A render");
        return null;
    }
});
React.render(, document.getElementById("example"));

#控制臺打印
A componentWillMount
A render
A componentDidMount
componentWillMount

componentWillMount里允許我們初始化前最后一次對state進行修改,而不會觸發(fā)重新渲染。

var A = React.createClass({
    getInitialState: function () {
        return {init: false};
    },
    componentWillMount: function () {
        this.setState({init: true});
        console.log("A componentWillMount");
    },
    componentDidMount: function () {
        console.log("A componentDidMount");
    },
    render: function () {
        console.log("A render:" + this.state.init);
        return null;
    }
});
React.render(, document.getElementById("example"));

#控制臺打印
A componentWillMount
A render:true
A componentDidMount

如果在componentDidMount中setState,結(jié)果就會是這樣的。

var A = React.createClass({
    getInitialState: function () {
        return {init: false};
    },
    componentWillMount: function () {
        console.log("A componentWillMount");
    },
    componentDidMount: function () {
        this.setState({init: true});
        console.log("A componentDidMount");
    },
    render: function () {
        console.log("A render:" + this.state.init);
        return null;
    }
});
React.render(, document.getElementById("example"));

#控制臺打印
A componentWillMount
A render:false
A componentDidMount
A render:true

也許會有人會問了:在這個方法中

componentDidMount: function () {
    this.setState({init: true});
    console.log("A componentDidMount");
}

先調(diào)用了setState,為啥不是先打印 ‘A render:true’后打印‘A componentDidMount’呢?

setState并不是一個同步的方法,可以理解為異步。

這里容易犯的錯誤就是,setState完后,馬上就獲取state的值做處理,結(jié)果獲取的還是老的state。

var A = React.createClass({
    getInitialState: function () {
        return {init: false};
    },
    componentWillMount: function () {
        console.log("A componentWillMount");
    },
    componentDidMount: function () {
        this.setState({init: true});
        console.log("A componentDidMount:" + this.state.init);
    },
    render: function () {
        console.log("A render:" + this.state.init);
        return null;
    }
});
React.render(, document.getElementById("example"));

#控制臺打印
A componentWillMount
A render:false
A componentDidMount:false
A render:true

如果想setState后獲取到更新的值,可以放在回調(diào)里

var A = React.createClass({
    getInitialState: function () {
        return {init: false};
    },
    componentWillMount: function () {
        console.log("A componentWillMount");
    },
    componentDidMount: function () {
        this.setState({init: true}, function () {
            console.log("callback:" + this.state.init);
        });
        console.log("A componentDidMount");
    },
    render: function () {
        console.log("A render:" + this.state.init);
        return null;
    }
});
React.render(, document.getElementById("example"));

#控制臺打印
A componentWillMount
A render:false
A componentDidMount
A render:true
callback:true
componentDidMount

componentDidMount渲染完成后執(zhí)行一次,一般我們會在這里異步獲取數(shù)據(jù),重新渲染頁面。例如

var A = React.createClass({
    getInitialState: function () {
        return {data: []};
    },
    fetchData: function (callback) {
        setTimeout(
            function () {
                callback([1, 2, 3]);
            },
            1000
        );
    },
    componentDidMount: function () {
        this.fetchData(function (data) {
            this.setState({data: data});
        }.bind(this));
    },
    render: function () {
        var data = this.state.data;
        return (
            data.length ?
                
    {this.state.data.map(function (item) { return
  • {item}
  • })}
:
loading data...
) } }); React.render(
, document.getElementById("example"));

官方文檔上也說的很清楚,建議我們在componentDidMount中添加ajax,因為這是DOM已經(jīng)完成了初始化的渲染,在componentWillMount中獲取也可以,例如上面的例子,換在componentWillMount中獲取數(shù)據(jù),完全OK的。但是不建議大家這么干,第一個是官方不推薦,另一個因為DOM還沒有渲染,這個時候的一些DOM操作就會出錯!

嵌套

看個父子組件的執(zhí)行過程,加深對初始化渲染過程的理解。

var Child = React.createClass({
    componentWillMount: function () {
        console.log("Child componentWillMount");
    },
    componentDidMount: function () {
        console.log("Child componentDidMount");
    },
    render: function () {
        console.log("Child render");
        return null;
    }
});

var Parent = React.createClass({
    componentWillMount: function () {
        console.log("Parent componentWillMount");
    },
    componentDidMount: function () {
        console.log("Parent componentDidMount");
    },
    render: function () {
        console.log("Parent render");
        return ;
    }
});
React.render(, document.getElementById("example"));

#控制臺打印
Parent componentWillMount
Parent render
Child componentWillMount
Child render
Child componentDidMount
Parent componentDidMount
組件更新

更新方法只會在組件初始化渲染完成后且觸發(fā)了重新渲染的條件才會執(zhí)行。更新方法同掛載方法分處組件生命周期的不同的階段。例如一個嬰兒在出生前和出生后,這是兩個不同的階段。

componentWillReceiveProps

組件接收到新的props時會調(diào)用,一般在組件嵌套中比較常見,單一組件state變化是不會執(zhí)行這個函數(shù)的。例如

var A= React.createClass({
    componentWillReceiveProps: function (nextProps) {
        console.log("A componentWillReceiveProps");
    },
    componentDidMount: function () {
        this.setState({name: "zzz"});
    },
    render: function () {
        return null;
    }
});
React.render(, document.getElementById("example"));

控制臺啥也沒打印

因為對組件來說,他的props是不可變的。在看另外一個例子:

var Child = React.createClass({
    componentWillReceiveProps: function (nextProps) {
        console.log("Child componentWillReceiveProps");
    },
    render: function () {
        return 
{this.props.name}
; } }); var Parent = React.createClass({ getInitialState: function () { return {name: "xxx"}; }, componentDidMount: function () { this.setState({name: "zzz"}); }, render: function () { return ; } }); React.render(, document.getElementById("example")); #控制臺打印 Child componentWillReceiveProps

盡管沒有傳遞屬性,但是方法依舊會執(zhí)行,只不過nextProps是個空對象而已。有人會問了,在Child組件當中,初始化渲染的時候name值為‘xxx’,第二次更新的時候name值為‘zzz’,為什么會說組件的props是不變的呢?這里不是發(fā)生變化了么?

按照我的個人理解,組件props不變指的是在它的生命周期的階段中,保持不變。例如初始化渲染的過程中,如果在componentWillMount方法中,手動修改props,控制臺就會提示如下警告。組件更新方法主要是相應state的變化,此處更不應該去修改props。

Warning: Don"t set .props.name of the React component . 
Instead, specify the correct value when initially         
creating the element. The element was created by Parent.

componentWillReceiveProps主要是在更新前,最后一次修改state,而不會觸發(fā)重新渲染。有點類似componentWillMount,但是執(zhí)行的時間不一樣,例如

var Child = React.createClass({
    getInitialState: function () {
        return {show: false};
    },
    componentWillReceiveProps: function (nextProps) {
        if (this.props.name !== nextProps.name) {
            this.setState({show: true});
        }
    },
    render: function () {
        return this.state.show ? 
{this.props.name}
: null; } }); var Parent = React.createClass({ getInitialState: function () { return {name: "xxx"}; }, componentDidMount: function () { this.setState({name: "xxx"}); }, render: function () { return ; } }); React.render(, document.getElementById("example"));

我們要盡量避免父子組件當中都有state,這樣組件的復用性就會降低,一般來說保持最外層的容器組件同服務器、用戶交互,改變state,而子組件只負責通過props接收數(shù)據(jù),然后渲染頁面。這也是官方推薦的做法。

shouldComponentUpdate

更新前調(diào)用,返回值決定了組件是否更新。例如

var A = React.createClass({
    componentDidMount: function () {
        this.setState({});
    },
    shouldComponentUpdate: function (nextProps, nextState) {
        console.log("A shouldComponentUpdate");
        return true;
    },
    componentWillUpdate: function () {
        console.log("A componentWillUpdate");
    },
    componentDidUpdate: function () {
        console.log("A componentDidUpdate");
    },
    render: function () {
        console.log("A render");
        return null ;
    }
});

React.render(, document.getElementById("example"));

#控制臺打印     
A render
A shouldComponentUpdate
A componentWillUpdate
A render
A componentDidUpdate

第一個render是初始化。組件會將render方法的返回值同已有的DOM結(jié)構(gòu)比較,只更新有變動的的部分,這個過程是需要花費時間的,在這個方法中我可以決定是否需要更新組件,從而減少性能的損耗。

this.forceUpdate()不會執(zhí)行shouldComponentUpdate方法,因為是強制更新,不會因為shouldComponentUpdate的返回值決定是否更新,所以跳過該方法。另外還需要注意的是,this.forceUpdate()調(diào)用會導致該組件的shouldComponentUpdate不執(zhí)行,對子組件的shouldComponentUpdate方法沒有影響。

componentWillUpdate、componentDidUpdate

組件更新前后執(zhí)行,沒辦法決定組件是否更新,只能進行些非狀態(tài)的操作,個人感覺用途不太明顯。

組件更新的整個過程

var Child = React.createClass({
    componentWillReceiveProps: function () {
       console.log("Child componentWillReceiveProps");
    },
    shouldComponentUpdate: function (nextProps, nextState) {
        console.log("Child shouldComponentUpdate");
        return true;
    },
    componentWillUpdate: function () {
        console.log("Child componentWillUpdate");
    },
    componentDidUpdate: function () {
        console.log("Child componentDidUpdate");
    },
    render: function () {
        console.log("Child render");
        return null ;
    }
});

var Parent = React.createClass({
    componentDidMount: function () {
        this.setState({});
    },
    render: function () {
        return ;
    }
});

React.render(, document.getElementById("example"));

#控制臺打印
Child render
Child componentWillReceiveProps
Child shouldComponentUpdate
Child componentWillUpdate
Child render
Child componentDidUpdate

第一個render是初始化調(diào)用的,不是更新的過程。

移除 componentWillUnmount

組件被移除前調(diào)用,這里可以做一些清除工作,例如清除內(nèi)存,解除事件的監(jiān)聽等等。

var A = React.createClass({
    componentDidMount: function () {
        this.interval = setInterval(
            function () {
                console.log("running");
            },
            100
        );
    },
    handleClick: function () {
      React.unmountComponentAtNode(document.getElementById("example"));
    },
    componentWillUnmount: function () {
        clearInterval(this.interval);
    },
    render: function () {
        return ;
    }
});

React.render(, document.getElementById("example"));

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85954.html

相關(guān)文章

  • React V16.3生命周期:The Component Lifecycle Flowchart

    摘要:學習免不了對組件生命周期的學習,我們應該掌握最新生命周期,學以致用,以達到性能優(yōu)化的目的。 學習React免不了對組件生命周期的學習,我們應該掌握最新生命周期,學以致用,以達到性能優(yōu)化的目的。 The Component Lifecycle React Version: 16.3 1 生命周期可視化 高清大圖--歡迎轉(zhuǎn)載 showImg(https://segmentfault.co...

    curried 評論0 收藏0
  • 【譯】State and Lifecycle (State和生命周期)

    摘要:結(jié)果如下打開試試下一步,我們將把組件功能自己設(shè)置定時器并且能每秒更新。這是一個設(shè)置定時器的好地方注意我們是怎么保存定時器的。我們將在這個生命周期的函數(shù)方法中卸載掉定時器最后,我們會每一秒跑方法。 下面是react官方文檔的個人翻譯,如有翻譯錯誤,請多多指出原文地址:https://facebook.github.io/re... Consider the ticking clock e...

    dadong 評論0 收藏0
  • react.js入門篇

    摘要:搭建項目,引入既然學習,那就從開始。項目工程目錄如下編寫在我理解看來,項目文件入口即是文件,那么從中編寫。官方文檔所述圖片注文章末尾段組件生命周期引入自 Hello Word 1.搭建項目,引入react 既然學習react,那就從hello word開始。當然必不可少的需要引入react,這里我使用的是官網(wǎng)的 Creating a New Application 方式,通過以下命令...

    harryhappy 評論0 收藏0
  • React中的“蟲洞”——Context

    摘要:理論上,通過一層層傳遞下去當然是沒問題的。不過這也太麻煩啦,要是能在最外層和最里層之間開一個穿越空間的蟲洞就好了。使用看起來很高大上的使用起來卻異常簡單。就像中的全局變量,只有真正全局的東西才適合放在中。 當我們寫React時,我們總是通過改變State和傳遞Prop對view進行控制,有時,也會遇到一點小麻煩。 背景 但是隨著我們的應用變的越來越復雜,組件嵌套也變的越來越深,有時甚至...

    muddyway 評論0 收藏0
  • 用 Vue 來寫 ReactReactNative

    摘要:的響應核心的響應式系統(tǒng)是支撐整個框架運行的關(guān)鍵,也是的核心之一,官方對這個核心的分層設(shè)計得很好也是依靠其驅(qū)動原生視圖。我們?nèi)粘S玫降亩加珊诵奶峁?,對這個核心稍作修改,去掉和,意外的獲得了一個極小的響應核心,可以運行于任何標準引擎下。 showImg(https://segmentfault.com/img/bVPMZy?w=1468&h=826); GitHub: react-vue ...

    maybe_009 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<