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