在 React 中,數(shù)據(jù)是自頂而下單向流動(dòng)的,即從父組件到子組件。這條原則讓組件之間的關(guān)系變得見(jiàn)得且可預(yù)測(cè)。
state 與 props 是 React 組件中最重要的概念。如果頂層組件初始化 props,那么 React 會(huì)向下遍歷整棵組件樹(shù),重新嘗試渲染所有相關(guān)的子組件。state 只關(guān)心每個(gè)組件自己內(nèi)部的狀態(tài),這些狀態(tài)只能在組件內(nèi)變化。把組件看成一個(gè)函數(shù),那么它接收了 props 作為參數(shù),內(nèi)部由 state 作為函數(shù)的內(nèi)部參數(shù),返回一個(gè) Virtual DOM 的實(shí)現(xiàn)。
state
state 是組件內(nèi)部狀態(tài),修改 state 的值修改需要通過(guò) setState 方法,禁止直接修改 state,setState 是一個(gè)異步方法,修改完成會(huì)有一個(gè)回調(diào)方法,一個(gè)生命周期內(nèi)所有 setState 方法會(huì)合并統(tǒng)一操作。
不推薦過(guò)多的使用 state,當(dāng)數(shù)據(jù)更新同時(shí)需要更新界面的時(shí)候,才使用 state,并且盡量將 state 推到系統(tǒng)邊緣,統(tǒng)一管理 state。過(guò)多的內(nèi)部狀態(tài)會(huì)讓數(shù)據(jù)流混亂,程序變得難以維護(hù)。
props
props 是 properties 縮寫,是 React 用來(lái)讓組件之間相互聯(lián)系的一種機(jī)制。
React 的單向數(shù)據(jù)流,主要的流動(dòng)管道就是 props,props 本身是不可變的。
注意:父組件傳遞的 props,作為子組件的 state,會(huì)產(chǎn)生引用對(duì)象影響問(wèn)題,也就是賦值是一個(gè)淺復(fù)制,會(huì)導(dǎo)致 state 改變進(jìn)而導(dǎo)致 父組件的 props 改變。
React 中有一個(gè)內(nèi)置的 prop -- children,代表子組件的集合。
ES6 方法定義的組件類中,可以通過(guò)增加類的 protTypes 屬性來(lái)定義 prop 規(guī)格,這不只是聲明,而且是一種限制,在運(yùn)行時(shí)和靜態(tài)代碼檢查時(shí),都可以根據(jù) propTypes 判斷外部是否正確地使用了組件的屬性。
import PropTypes from 'prop-types';
static propTypes = {
data: PropTypes.object.isRequired,
onPress: PropTypes.func,
};
對(duì)于帶上 isRequired 的屬性,表示使用時(shí)必須要指定,沒(méi)有帶上的則表示沒(méi)有也無(wú)所謂。
propTypes 支持基本類型,還支持枚舉和自定義類型。
prop 和 state 的對(duì)比
- prop 用于定義外部接口,state用于紀(jì)錄內(nèi)部狀態(tài);
- prop 的賦值在外部使用組件時(shí),state 的賦值在組件內(nèi)部;
- 組件不應(yīng)該改變 prop 的值,而 state 存在的目的就是讓組件來(lái)改變。