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

資訊專欄INFORMATION COLUMN

解讀React源碼(三):生命周期的管理藝術(shù)

lk20150415 / 2974人閱讀

摘要:前言的主要思想是通過(guò)構(gòu)建可復(fù)用組件來(lái)構(gòu)建頁(yè)面所謂組件其實(shí)就是有限狀態(tài)機(jī)通過(guò)狀態(tài)渲染對(duì)應(yīng)的界面且每個(gè)組件都有自己的生命周期它規(guī)定了組件的狀態(tài)和方法需要在哪個(gè)階段改變和執(zhí)行子組件子組件子組件子組件初探生命周期當(dāng)首次掛載組件時(shí)按順序執(zhí)行當(dāng)卸載組件

前言

React的主要思想是通過(guò)構(gòu)建可復(fù)用組件來(lái)構(gòu)建頁(yè)面.
所謂組件,其實(shí)就是有限狀態(tài)機(jī)(FSM),通過(guò)狀態(tài)渲染對(duì)應(yīng)的界面,且每個(gè)組件都有自己的生命周期,
它規(guī)定了組件的狀態(tài)和方法需要在哪個(gè)階段改變和執(zhí)行.

class Collections extends Component {
    constructor(props) {
        super(props);
        this.state = {
            a: 1
        }
    }
    add = () => {
        this.setState({
            a: this.state.a + 1
        });
    }
    componentWillMount() {
        console.log("componentWillMount");
    }
    componentDidMount() {
        console.log("componentDidMount");
        this.setState({
            a: 2
        });
    }
    componentWillUnMount() {
        console.log("componentWillUnMount");
    }
    render() {
        console.log("render");
        return (
            
{ this.state.a }
); } }
import React, { Component, PropTypes } from "react";

export default class Example extends Component {
    static propTypes = {
        a: PropTypes.number.isRequired
    };
    static defaultProps = {
        a: 0
    }; 
    constructor(props) {
        super(props);
        this.state = {
            b: 1
        };
    }
    add = () => {
        this.setState({
            b: this.state.b + 1
        });
    }
    componentWillReceiveProps(nextProps) {
        console.log(nextProps);
        if (nextProps.a === 4) {
            this.setState({
                b: 1000
            });
        }
    }
    shouldComponentUpdate(nextProps, nextState) {
        console.log(nextProps);
        console.log(nextState);
        if (nextState.b === 4) {
            return false;
        }
        return true;
    }
    componentWillMount() {
        console.log("子組件componentWillMount");
    }
    componentDidMount() {
        console.log("子組件componentDidMount");
    }
    render() {
        console.log("子組件render");
        return (
            

a:{ this.props.a }

b:{ this.state.b }

); } }
初探react生命周期

當(dāng)首次掛載組件時(shí),按順序執(zhí)行g(shù)etDefaultProps,getInitialState,componentWillMount,render,componentDidMount
當(dāng)卸載組件時(shí),執(zhí)行componentWillUnMount
當(dāng)再次渲染組件時(shí),組件接收到更新?tīng)顟B(tài),此時(shí)按順序執(zhí)行componentWillReceiveProps,shouldComponentUpdate,
componentWillUpdate,render和componentDidUpdate

使用createClass創(chuàng)建自定義組件

createClass是創(chuàng)建自定義組件的入口方法,負(fù)責(zé)管理生命周期方法中的getDefaultProps.
該方法在整個(gè)生命周期中只執(zhí)行一次,這樣所有實(shí)例初始化的props將會(huì)被共享.
通過(guò)createClass創(chuàng)建自定義組件,利用原型繼承ReactClassComponent父類,
按順序合并minin,設(shè)置初始化defaultProps,返回構(gòu)造函數(shù).
當(dāng)使用ES6 classes編寫React組件時(shí),class MyComponent extends React.Component
其實(shí)就是調(diào)用內(nèi)部方法createClass創(chuàng)建組件.

var ReactClass = {
    // 創(chuàng)建自定義組件
    createClass: function(spec) {
        var Constructor = function(props, context, updater) {
            // /自動(dòng)綁定
            if (this._reactAutoBindPairs.length) {
                bindAutoBindMethods(this);
            }

            this.props = props;
            this.context = context;
            this.refs = emptyObject;
            this.updater = updater || ReactNoopUpdateQueue;
            this.state = null;
            // ReactClass沒(méi)有構(gòu)造函數(shù),通過(guò)getInitialState和componentWillMount來(lái)代替
            var initialState = this.getInitialState ? this.getInitialState() : null;
            this.state = initialState;
        };

        // 原型繼承父類
        Constructor.prototype = new ReactClassComponent();
        Constructor.prototype.constructor = constructor;
        Constructor.prototype._reactAutoBindPairs = [];

        // 合并mixin
        injectedMixins.forEach(
            minSpecIntoComponent.bind(null, Constructor)
        );

        minSpecIntoComponent(Constructor, spec);

        // 所有mixin合并后初始化defaultProps(在整個(gè)生命周期中,getDefaultProps只執(zhí)行一次)
        if (Constructor.getDefaultProps) {
            Constructor.defaultProps = Constructor.getDefaultProps();
        }
        // 減少查找并設(shè)置原型的時(shí)間
        for (var methodName in ReactClassInterface) {
            if (!Constructor.prototype[methodName]) {
                Constructor.prototype[methodName] = null;
            }
        }

        return Constructor;
    }
};
MOUNTING

mountComponent負(fù)責(zé)管理生命周期中的getInitialState,componentWillMount,render和componentDidMount
由于getDefaultProps是通過(guò)構(gòu)造函數(shù)進(jìn)行管理的,所以也是整個(gè)生命周期中最先開(kāi)始執(zhí)行的.
react是利用更新隊(duì)列this._pendingStateQueue以及更新?tīng)顟B(tài)this._pendingReplaceState
和this._pendingForceUpdate來(lái)實(shí)現(xiàn)setState的異步更新機(jī)制.
其實(shí),mountComponent本質(zhì)上是通過(guò)遞歸渲染內(nèi)容的,由于遞歸的特性,父組件的componentWillMount
在其子組件的componentWillMount之前調(diào)用,而父組件的componentDidMount在其子組件的componentDidMount之后調(diào)用.

RECEIVE_PROPS

updateComponent負(fù)責(zé)管理生命周期中的componentWillReceiveProps,shouldComponentUpdate,componentWillUpdate,
render和componentDidUpdate.
若存在componentWillReceiveProps,則執(zhí)行.
如果此時(shí)在componentWillReceiveProps中調(diào)用setState,是不會(huì)觸發(fā)re-render的,而是會(huì)進(jìn)行state合并.
且在componentWillReceiveProps,shouldComponentUpdate和componentWillUpdate中也還是無(wú)法獲取到更新后的this.state,
即此時(shí)訪問(wèn)的this.state仍然是未更新的數(shù)據(jù),因此只有render和componentDidUpdate中才能獲取到更新后的this.state

componentWillReceiveProps(nextProps) {
    console.log(nextProps);
    if (nextProps.a === 4) {
        this.setState({
            b: 1000
        }, () => {
            console.log(this.state.b);
        });
    }
}
UNMOUTING

unmountComponnet負(fù)責(zé)管理生命周期中的componentWillUnMount
如果存在componentWillUnMount,則執(zhí)行并重置所有相關(guān)參數(shù),更新隊(duì)列以及更新?tīng)顟B(tài),
如果此時(shí)在componentWillUpdate中調(diào)用setState,是不會(huì)觸發(fā)re-render的,這是因?yàn)?br>所有更新隊(duì)列和更新?tīng)顟B(tài)都被重置為null,并清除了公共類,完成了組件卸載操作.

無(wú)狀態(tài)組件

無(wú)狀態(tài)組件只是一個(gè)render方法,并沒(méi)有組件類的實(shí)例化過(guò)程,也沒(méi)有實(shí)例返回.
無(wú)狀態(tài)組件沒(méi)有狀態(tài),沒(méi)有生命周期,只是簡(jiǎn)單的接受props渲染生成DOM結(jié)構(gòu),
是一個(gè)純粹為渲染而生的組件.
由于無(wú)狀態(tài)組件有簡(jiǎn)單,便捷,高效等諸多優(yōu)點(diǎn),所以如果可能的話請(qǐng)盡量使用無(wú)狀態(tài)組件.

import React from "react";

const HelloWorld = (props) => {
    return (
        
{ props.a }
); } export default HelloWorld;

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

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

相關(guān)文章

  • 解讀React源碼(一):初探React源碼

    摘要:前言的基本概念組件的構(gòu)建方法以及高級(jí)用法這背后的一切如何運(yùn)轉(zhuǎn)深入內(nèi)部的實(shí)現(xiàn)機(jī)制和原理初探源碼代碼組織結(jié)構(gòu)包含一系列的工具方法插件包含一系列同構(gòu)方法包含一些公用或常用方法如等包含一些測(cè)試方法等包含一些邊界錯(cuò)誤的測(cè)試用例是代碼的核心部分它包含了 前言 React的基本概念,API,組件的構(gòu)建方法以及高級(jí)用法,這背后的一切如何運(yùn)轉(zhuǎn),深入Virtual DOM內(nèi)部的實(shí)現(xiàn)機(jī)制和原理. 初探Rea...

    Eminjannn 評(píng)論0 收藏0
  • React 源碼深度解讀(七):事務(wù) - Part 1

    摘要:在學(xué)習(xí)源碼的過(guò)程中,給我?guī)椭畲蟮木褪沁@個(gè)系列文章,于是決定基于這個(gè)系列文章談一下自己的理解。說(shuō)明就算拋出了錯(cuò)誤,部分的代碼也要繼續(xù)執(zhí)行,隨后再將錯(cuò)誤往上層代碼拋。和都能保證其中一個(gè)成員拋出錯(cuò)誤的時(shí)候,余下的能繼續(xù)執(zhí)行。 前言 React 是一個(gè)十分龐大的庫(kù),由于要同時(shí)考慮 ReactDom 和 ReactNative ,還有服務(wù)器渲染等,導(dǎo)致其代碼抽象化程度很高,嵌套層級(jí)非常深,閱讀...

    KavenFan 評(píng)論0 收藏0
  • 【Under-the-hood-ReactJS-Part11】React源碼解讀

    摘要:技術(shù)上來(lái)說(shuō),當(dāng)方法被調(diào)用后或者發(fā)生改變后,方法都會(huì)被調(diào)用。下一步,會(huì)設(shè)置為。之后,檢測(cè)當(dāng)前更新是否由更新引起的。這是因?yàn)?,使用是?dǎo)致組件持久化更新,而會(huì)被方法的返回值重新賦值。 接上文, React流程圖:https://bogdan-lyashenko.gith... 更新組件 關(guān)于組件的更新,我們先看下代碼里的注釋: 對(duì)于已掛載組件的更新過(guò)程,React會(huì)首先調(diào)用component...

    hiyayiji 評(píng)論0 收藏0
  • 【Under-the-hood-ReactJS-Part6】React源碼解讀

    摘要:源碼里有個(gè)獨(dú)立的模塊管理組件的所有子元素。第一個(gè),實(shí)例化子元素使用并掛載它們。至于具體掛載流程,基于子元素類型的不同而有不同的掛載過(guò)程。掛載的過(guò)程基本完成了。 接上文, React流程圖:https://bogdan-lyashenko.gith... 創(chuàng)建初始子組件 在之前的步驟里,組件本身的構(gòu)建已經(jīng)完成,接下去,我們分析它們的子元素??偣卜譃閮刹剑簰燧d子元素(this.mountC...

    codergarden 評(píng)論0 收藏0
  • React學(xué)習(xí)之解讀React源碼

    摘要:根據(jù)的類型不同,分別實(shí)例化類。并且處理特殊屬性,比如事件綁定。之后根據(jù)差異對(duì)象操作元素位置變動(dòng),刪除,添加等。各個(gè)組件獨(dú)立管理層層嵌套,互不影響,內(nèi)部實(shí)現(xiàn)的渲染功能。根據(jù)基本元素的值,判斷是否遞歸更新子節(jié)點(diǎn),還是刪除舊節(jié)點(diǎn),添加新節(jié)點(diǎn)。 首先理解ReactElement和ReactClass的概念。想要更好的利用react的虛擬DOM,diff算法的優(yōu)勢(shì),我們需要正確的優(yōu)化、組織rea...

    developerworks 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<