React入門--------組件的聲明周期

來源:互聯網
上載者:User

標籤:false   傳回值   function   document   nbsp   表示   執行   end   改變   

  • Mounting/組件掛載相關:

componentWillMount

componentDidMount

  • Updating/組件更新相關:

componentWillReceiveProps

shouldComponentUpdate

componentWillUpdate

componentDidUpdate

  • Unmounting/組件移除相關:

componentWillUnmount

一、Mounting/組件掛載相關

componentWillMount

在組件掛載之前執行,但僅執行一次,即使多次重複渲染改組件,或者改變了組件的state。若希望該回到能執行多次,可以使用ReactDOM.unmountComponentAtNode移除掉已有的組件,然後再重新render。

    var diva = document.getElementById(‘a‘);    var divb = document.getElementById(‘b‘);    var i=0;    var Component1 = React.createClass({        componentWillMount:function(){            console.log(++i)        },        render: function() {            console.log(Date.now());            return <div name={this.props.name}>我只是一個安靜的div</div>        }    });    
  //觸發componentWillMount,render ReactDOM.render( <Component1 />, diva );
  
  //未觸發componentWillMount,觸發render ReactDOM.render( <Component1 />, diva );
  //觸發componentWillMount,render ReactDOM.render( <Component1 />, divb );
  //未觸發componentWillMount,未觸發render ReactDOM.render( <Component1 />, divb );

componentDidMount

在組件掛載之後執行,同componentWillMount一樣,同一個組件重複渲染只執行一次,卸載組件後重新渲染可以重新觸發一次。

二、Updating/組件更新相關

componentWillReceiveProps

在組件接收到props的時間點之前調用,注意組件初始化渲染時不會調用。

    var i = 0;    var div = document.getElementById(‘a‘),    var div2 = document.getElementById(‘b‘);    var Component1 = React.createClass({        componentWillReceiveProps: function(){            console.log(i++)        },        clickCb: function() {            React.render(                <Component1 />, div2            );        },        render: function() {            return <div onClick={this.clickCb}>點我給下一個div掛載組件</div>        }    });    React.render(        <Component1 />, div  //初始化不會觸發componentWillReceiveProps    );    React.render(            <Component1 />, div   //重複渲染會觸發componentWillReceiveProps    );    React.unmountComponentAtNode(div);  //移除掉已有組件    React.render(        <Component1 />, div  //初始化不會觸發componentWillReceiveProps    );

運行結果如下:

該介面帶有一個參數nextProps,可以利用它來擷取新的props的值(this.props擷取到的是當前的,也就是舊的props)

  var i = 0;  var div = document.getElementById(‘a‘);  var render = function(){            React.render(                    <Component1 i={i++} />, div            );        };    var Component1 = React.createClass({        componentWillReceiveProps: function(nextProps){            console.log(this.props.i, nextProps.i)        },        render: function() {            return <div onClick={render}>props.i的值是:{this.props.i}</div>        }    });    render();

運行結果如下

shouldComponentUpdate

該介面實際是在組件接收到了新的props或者新的state的時候會立即調用,然後通過傳回值來決定是否要重新渲染當前的組件。

介面帶兩個參數,第一個參數表示新的props,第二個參數表示新的state。

  var div = document.getElementById(‘a‘);  var Component1 = React.createClass({        getInitialState: function(){            return { i : 0 }        },        shouldComponentUpdate: function(nextProps, nextState){            console.log( this.state.i, nextState.i );            return nextState.i > 3 ? true : false; //返回true才會渲染組件        },        clickCb: function(){            this.setState({                i : this.state.i + 1            })        },        render: function() {            return <div onClick={this.clickCb}>state.i的值是:{this.state.i}</div>        }    });    ReactDOM.render(            <Component1 />, div    );

點擊第四次之後才會渲染組件,在div裡顯示正確的新state.i

 

componentWillUpdate

同shouldComponentUpdate一樣,在組件收到新的props或者state的時候會調用,而且也有著兩個參數來擷取新的props和state。

不過本介面僅在shouldComponentUpdate執行並返回了true的時候才會被調用。

在上一個代碼執行個體中做點改動

 componentWillUpdate: function(nextProps, nextState){            console.log( ‘yoyoyo‘, this.state.i, nextState.i );        },

componentDidUpdate

在組件更新,重新渲染完畢之後調用,它和componentWillUpdate一樣有著兩個參數來擷取新的props和state

 var div = document.getElementById(‘a‘);    var Component1 = React.createClass({        getInitialState: function(){            return { i : 0 }        },        shouldComponentUpdate: function(nextProps, nextState){            console.log( this.state.i, nextState.i );            return nextState.i > 3 ? true : false; //返回true才會執行componentWillUpdate並重新渲染組件        },        componentDidUpdate: function(nextProps, nextState){            console.log( ‘已經渲染完畢咯‘, this.state.i, nextState.i );        },        componentWillUpdate: function(nextProps, nextState){            console.log( ‘還沒渲染哦‘, this.state.i, nextState.i );        },        clickCb: function(){            this.setState({                i : this.state.i + 1            })        },        render: function() {            return <div onClick={this.clickCb}>state.i的值是:{this.state.i}</div>        }    });    ReactDOM.render(            <Component1 />, div    );

運行結果如下:

三、Unmounting/組件移除相關:

明天繼續

React入門--------組件的聲明周期

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.