摘要:前言的主要思想是通過(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 (初探react生命周期); } }a:{ this.props.a }
b:{ this.state.b }
當(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)建自定義組件的入口方法,負(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)用.
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)組件只是一個(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
摘要:前言的基本概念組件的構(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...
摘要:在學(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í)非常深,閱讀...
摘要:技術(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...
摘要:源碼里有個(gè)獨(dú)立的模塊管理組件的所有子元素。第一個(gè),實(shí)例化子元素使用并掛載它們。至于具體掛載流程,基于子元素類型的不同而有不同的掛載過(guò)程。掛載的過(guò)程基本完成了。 接上文, React流程圖:https://bogdan-lyashenko.gith... 創(chuàng)建初始子組件 在之前的步驟里,組件本身的構(gòu)建已經(jīng)完成,接下去,我們分析它們的子元素??偣卜譃閮刹剑簰燧d子元素(this.mountC...
摘要:根據(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...
閱讀 1271·2021-11-15 18:14
閱讀 3128·2021-08-25 09:38
閱讀 2663·2019-08-30 10:55
閱讀 2673·2019-08-29 16:39
閱讀 1305·2019-08-29 15:07
閱讀 2446·2019-08-29 14:14
閱讀 810·2019-08-29 12:36
閱讀 909·2019-08-29 11:21