1. 程式人生 > >React-資料流詳解

React-資料流詳解

在元件的整個生命週期中,隨著該元件的props或者state發生改變,它的DOM表現也將有相應的改變,一個元件就是一個狀態機,對於特定的輸入,它總會返回一致的輸出。

React為每個元件提供了生命週期鉤子函式去響應不同的時刻——建立時、存在期及銷燬時。

生命週期方法

React的元件擁有簡潔的生命週期API,它僅僅提供你所需要的方法,而不會去最求全面。

例項化:

一個例項出吃被穿件時所呼叫的生命週期方法與其他哥哥後續例項被建立所呼叫的方法略有不同。當你首次使用一個組建類時,會看到下面這些方法依次被呼叫:

getDefaultProps

getInitialState

componentWillMount

render

ComponentDidMOunt

對於該元件類所有後續應用,你將會看到下面的方法依次被呼叫。注意:gerDefaultProps方法不在列表中。

getInitialState

componentWillMount

render

componentDidMount

存在期:

隨著應用狀態的改變,以及元件逐漸受到影響,你將會看到下面的方法一次被呼叫:

componentwillReceiveProps

shouldComponentUpdate

componentWillUpdate

render

componentDidUpdate

銷燬

&清理期:

最後,當該元件被使用完成後,componentWillUnmount方法會被呼叫,目的是給這個例項提供清理自身的機會。

以下是詳細說明:

例項化:

當每個新的元件被建立首次渲染時,有一系列的方法可以用來為其做準備工作,這些方法中的每一個鬥毆明確的職責,如下所示:

getDefaultProps

對於元件來說,這個方法只會呼叫一次,對於那些沒有父輩元件指定的props屬性的新建例項來說,這個方法返回的物件可用與為例項設定預設的props值。

getInitalState:

對於元件的每個例項來說,這個方法呼叫次數有且僅有一次,這裡你將有機會初始化每個例項的state,與getDefaultProps方法不同的是,每次例項建立時該方法都會被呼叫一次,這個方法中,可以訪問到this.props.

componentWillMount:

該方法在完成首次渲染之前被呼叫,這也是在render方法呼叫前可以修改元件state的最後一次機會。

render:

在這裡你建立一個虛擬DOM,用來表示元件的輸出,對於一個元件來說,render是唯一一個必需的方法,並且有特定的規則。render方法選要滿足下面幾點:

只能通過this.props和this.state訪問資料。

可以返回null,false或者任何React元件。

只能出現一個頂級元件(不能返回一組元素)、

必須純淨,有位置不能改變元件狀態或者修改DOM輸出。

componentDidMount:

在render方法成功呼叫並且真實的DOM已經被渲染之後,可以在componentDidMount內部通過this.getDOMNode(方法訪問到它。

這就是你可以訪問原始DOM的生命週期的鉤子函式,當你需要測量DOM元素的高度或者使用計時器操作它或者執行jQuery外掛時,可以將這些操作掛載到這個方法上:

舉例來說,假設需要在一個通過React渲染出的表單元素上使用jQueryUI的Autocomplete外掛,則可以這樣使用它:

//需要自動補全的字串列表

var datasource =[...];

var MyComponent=React.crateClass({

render:function(){

rerurn <input .../>

},

componentDidMount:function(){

$(this.gerDOMNode()).autocomplete({

source:datasource

});

}

});

ps:當React執行在伺服器端時候,componentdidmount方法不會被呼叫。

存在期:

此時元件已經渲染好並且使用者可以與它進行互動,通常一次滑鼠點選、手指點按或者鍵盤事件觸發一個時間處理器,隨著使用者改變了元件或則和整個應用的state,便會有新的state流入元件樹,並且我們將會獲得操控它的機會。

componentWillReceiveProps:

任何時刻元件的props都可以通過父輩元件來更改,出現這種情況時,componentWillReceiveProps方法會被呼叫,你將獲得更改props方法及跟他關心state的機會。例如:

componentWillReceiveProps:function(nextProps){

if(nextProps.checked !==undefined){

this.setState({

checked:nextProps.checked

});

}

}

shouleComponentUpdate:

呼叫shoulecomponentUpadte方法在元件渲染時進行精確優化。如果某個元件或者它的任何子元件不需要渲染成新的props或則和state,則該方法返回false,返回false則是說明React要跳到render方法,一屆位於render前後的鉤子函式:componentWillUpadate和componentDidUpdate。

該方法非必需的,並且大部分情況沒有必要使用它。

componentWillUpdate:

和componentwillMount:方法類似,組建會在收到新的props或者state進行渲染之前呼叫該方法。

注意:你不可以在該方法中更新huo或者props。而應該藉助componentWillreceiveProps方法在執行時更新state。

componentDidUpdate:

和componentDidMount方法類似,該方法給我們更新已經渲染好的DOM機會。

銷燬&清理期

當React使用完一個元件,這個元件必須從DOM中解除安裝隨後被銷燬。此時僅有的一個狗子函式會做出響應,完成所有的清理和銷燬工作。

componentWillUnmount:

最後,隨著元件從他的層級結構中移除,這個元件的生命也就走id熬了盡頭,該方法會在元件被移除之前呼叫,讓你有機會做一些清理工作。在componentDidMount方法中新增的所有任務都需要在該方法中撤銷,比如穿件的定時器或者新增的事件監聽器。

反模式:把計算後的值賦值給state:

getInitalState方法中,嘗試通過this.props來建立state的做法是一種反模式。React專注於維護資料的單一來源。它的設計使得傳遞資料的來源更加顯而易見,這激素和iReact的一個優勢。

比如在元件中吧日期轉化成字串形式,或者渲染之前字串轉換為大寫。這些都不是state,只能夠在渲染時進行計算。

當元件的state值和它基於的prop不同步,因而無法瞭解到render函式內部結構時,可以認定為一種反模式。

//反模式:經過計算後值不應該賦給state

getDefaultProps:function(){

return{

date:newDate()

};

},

getInitalState:function(){

return{

day:this.props.date.getDay()

}

},

render:function(){

return <div>Day:{this.state.day}</day>

}

正確的模式應該是渲染時計算這些值,保證了計算後的值永遠不會派生出它的props值不同步。

//渲染時計算值是正確的

gerDefaultProps:function(){

return{

date:new Date()

};

}

render:function(){

var day = this.props.date.getDay();

return <div>Day:{day}</div>;

}

然而,如果你的目的並不是同步,而只是簡單的初始化state,那麼在getInitialState方法中使用props是沒問題的,只是一定要明確你的意圖,比如prop新增initial字首。

getDefaultProps:function(){

return{

initialValue:'some-dafault-value'

};

},

getInitialState:function(){

return{

value:this.props.initialValue

};

},

render:function(){

return <div>{this.props.value}</div>

}

總結:

react生命週期提供了進行設計的鉤子函式,會伴隨著元件整個生命週期。和狀態機類似,每個元件都被設計成了能夠在整個生命週期中輸出穩定、語義化的標籤。

元件不會獨立存,隨著父元件將props推送給他們的子元件,以及那些子元件渲染它們自身的子元件你必須謹慎的考慮資料是如何流經整個應用的。每一個子元件真正需要掌握多少資料,哪個元件來控制應用的狀態?這些涉及資料流了。

相關推薦

React-資料

在元件的整個生命週期中,隨著該元件的props或者state發生改變,它的DOM表現也將有相應的改變,一個元件就是一個狀態機,對於特定的輸入,它總會返回一致的輸出。 React為每個元件提供了生命週期鉤子函式去響應不同的時刻——建立時、存在期及銷燬時。 生命週期方法

深入理解JAVA I/O系列三:字符

buffer 情況 二進制文件 感到 復制代碼 使用範圍 轉換 fileread 方式 字符流為何存在 既然字節流提供了能夠處理任何類型的輸入/輸出操作的功能,那為什麽還要存在字符流呢?容我慢慢道來,字節流不能直接操作Unicode字符,因為一個字符有兩個字節,字節流一次只

10.5-全棧Java筆記:常見(三)

java上節我們講到「Java中常用流:緩沖流」,本節我們學習數據流和對象流~ 數據流數據流將“基本數據類型變量”作為數據源,從而允許程序以與機器無關方式從底層輸入輸出流中操作java基本數據類型。 DataInputStream和DataOutputStream提供了可以存取與機器無關的所有Java基礎類

C++: I/O(三)——串

name namespace 轉換 pac end 成員 col logs nbsp 一、串流 串流類是 ios 中的派生類 C++的串流對象可以連接string對象或字符串 串流提取數據時對字符串按變量類型解釋;插入數據時把類型 數據轉換成字符串 串流I/O具有格式化功能

Java輸入輸出2

output put 輸入流 基類 inpu reader 讀取 輸入輸出 NPU InputStream/Reader:所有輸入流的基類,只能從中讀取數據; OutputStream/Writer:所有輸出流的基類,只能向其寫入數據。Java輸入輸出流詳解2

java I/O

practice bubuko put bre 技術分享 writer 多媒體 buffered args 概況 I/O流主要分為二大類別:字符流和字節流。 字節流(基本流) 1、字節輸入流 類名:FileInputStream 特點:讀(對文件進行讀取操作)

Java常用IO

cat exce getpath tst IV trac AC output har 一、流的分類: 按照數據流向的不同:輸入流 輸出流 按照處理數據的單位的不同:字節流 字符流(處理的文本文件) 按照角色的不同:節點流(直接作用於文件的) 處理流 二、IO的體系

python for 資料型別【列表】

 range # 範圍  print(range(5))  print(list(range(10,0,-1))) [起始位置:終止位置:步長] range(起始位置,終止位置,步長) #顧頭不顧尾  1. 使用for迴圈和range列印50 - 0

hashmap資料結構(五)之HashMap、HashTable、ConcurrentHashMap 的區別

【hashmap 與 hashtable】   hashmap資料結構詳解(一)之基礎知識奠基 hashmap資料結構詳解(二)之走進JDK原始碼 hashmap資料結構詳解(三)之hashcode例項及大小是2的冪次方解釋 hashmap資料結構詳解(四)之has

一起學Python——資料型別

和學習其他程式語言一樣,首先要了解一門語言的資料型別。 Python的資料型別有整型、浮點型、字串、布林型、日期時間型別、list列表、set集合、tuple元組、dict詞典等。 1、整型 就是數學中的整數,包括負整數。 定義整型的方法: a = 100 b = -100 print(a) print

C/C++堆、棧及靜態資料(轉載只是為了查閱方便,若侵權立刪)

C/C++堆、棧及靜態資料區詳解   本文介紹C/C++中堆,棧及靜態資料區。     五大記憶體分割槽   在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。下面分別來介紹:   棧,就是那些由編譯器在需要的時候分配,在不需要

JVM之執行時資料區域

1、程式計數器                 程式計數器是一塊較小的記憶體空間,它可以看作是當前執行緒所執行的位元組碼的行號指示器。虛擬機器工作時就是通過改變改變計數器的值來選取下一條需要執行的位元組碼指

TCP傳送資料流程

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Oracle 資料庫 全部資料型別

資料型別 描述 VARCHAR2(size) 可變長度的字串,其最大長度為size個位元組;size的最大值是4000,而最小值是1;你必須指定一個VARCHAR2的size;  

Hadoop Streaming 做大資料處理

-------------------------------------------------------------------------- 以下內容摘自寒小陽老師大資料課程內容 -----------------------------

JVM 執行時資料

       1、PC暫存器(執行緒獨有):全稱是程式計數暫存器,它記載著每一個執行緒當前執行的JAVA方法的地址,如果是當前執行的是native方法,則程式計數器會是一個空地址。它的作用就是用來支援多執行緒,執行緒的阻塞、恢復、掛起等一系列操作。這

Redis內部資料結構——intset

本文是《Redis內部資料結構詳解》系列的第七篇。在本文中,我們圍繞一個Redis的內部資料結構——intset展開討論。 Redis裡面使用intset是為了實現集合(set)這種對外的資料結構。set結構類似於數學上的集合的概念,它包含的元素無序,且不能重複。Redis裡的set結構還實現了

分享《深度學習與計算機視覺演算法原理框架應用》《大資料架構資料獲取到深度學習》PDF資料

下載:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w 更多資料分享:http://blog.51cto.com/3215120 《深度學習與計算機視覺 演算法原理、框架應用》PDF,帶書籤,347頁。《大資料架構詳解:從資料獲取到深度學習》PDF,帶書籤,3

分享《深度學習與計算機視覺演算法原理框架應用》PDF《大資料架構資料獲取到深度學習》PDF +資料

下載:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w 更多分享資料:https://www.cnblogs.com/javapythonstudy/ 《深度學習與計算機視覺 演算法原理、框架應用》PDF,帶書籤,347頁。《大資料架構詳解:從資料獲取到深度學

JavaScript變數與資料型別

變數 變數來源於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變數可以通過變數名訪問。 變數的作用就是用於儲存值。 語法: 宣告變數時,總是以關鍵字var打頭。任何情況下都應該這樣做。然後給變數指定名稱。在宣告變數時,也可以給它賦值,方法是在變數名後面加上等號和值。賦值語句總是以分號