組件是React中重要特性之一。愛掏網 - it200.com我們可以將一個復雜的UI分解成多個基本組件。愛掏網 - it200.com在開發了基本組件之后,我們可以將所需的組件組合在一起創建一個復雜的UI(也稱為復雜的組件)。愛掏網 - it200.comReact中使用props
和state
控制組件中的數據流。愛掏網 - it200.com但剛接觸React的同學對這些所謂的props
和state
都會感到困惑,那么要掌握React就有必要掌握props
和state
。愛掏網 - it200.com在接下來的內容中我們主要圍繞著React的props
和state
和大家一起討論。愛掏網 - it200.com
時至今日,在Web開發中都在提Web組件。愛掏網 - it200.com在React中也避免不了這個話題,換句話說,組件的概念也是React中的三大支柱之一。愛掏網 - it200.com使用React開發應用基本都是在使用組件(其實在Vue的開發也是類似,也是圍繞著組件進行)。愛掏網 - it200.com雖然我們在《React中創建組件的方式》和《初探React中函數組件和類組件的差異》和大家一起學習過React中創建組件的方式和不同方式之間的差異。愛掏網 - it200.com但這些并不重要,重要的是我們想了解或者學習props
和state
對組件的影響。愛掏網 - it200.com
簡單地說,在React中怎么通過props
和state
來改變組件。愛掏網 - it200.com
那么什么是組件呢?@Linton Ye在他的博文《Components, Props and State》中用一個房子形象的描述了組件是什么?
整幢房子好比一個UI組件,只不過這個組件的每個部分都可以拆分出來成為一個獨立的組件。愛掏網 - it200.com正如上圖所示,房子House
是一個大組件,其中房頂Roof
、窗戶Window
、門Door
和墻Wall
也是一個組件,并且這些組件組合在一起成為一個大的組件,即House
組件。愛掏網 - it200.com
如果我們換到一個Web頁面中來說的話,上面的房子就好比下圖:
也就是說,React組件被視為用戶界面構建的模塊。愛掏網 - it200.com這些組件都存在于相同的空間中,但彼此又是獨立執行的。愛掏網 - it200.comReact中的組件都有自己的結構和方法。愛掏網 - it200.com它們最大的特性就是可以重復使用。愛掏網 - it200.com為了更好的理解,可以將整個UI看到一棵樹,這棵樹常常被稱為UI樹。愛掏網 - it200.com比如上面的Web頁面,如果轉換成一棵UI樹的話,大致像下面這樣:
在這里,起始組件成為根(好比House
,也類似HTML中的html
),每個獨立的部分成為分支(好比Roof
、Window
、Door
和Wall
,也類似上圖中的1~5
)。愛掏網 - it200.com當然,這些分支中也可以進一步包含一些其他的分支。愛掏網 - it200.com
而這些組件(UI)具有組織性,并且可以在根上根據狀態和數據做出相應的更改,然后再流向子分支(子組件)。愛掏網 - it200.com也可以簡單地說,組件可以直接從客戶端調用服務器,允許DOM在不刷新頁面的情況下動態更新。愛掏網 - it200.com也就是說,可以根據組件的props
或state
對組件進行動態更新(簡單地說,UI看上去不一樣)。愛掏網 - it200.com
同樣拿前面的House
組件來說,其中Roof
我們可以指定它是什么樣的顏色(根據自己的喜好將房頂刷成自己喜歡的顏色),當然Wall
和Window
以及Door
也類似于Roof
,但不同的是,門Door
和窗戶Window
除了可以根據自己喜歡定制之外,它們還有另外的狀態,比如說門是關閉的還是打開的(窗戶也是相似的)。愛掏網 - it200.com
如果將這些放到React中來描述的話,可以用props
和state
來描述:
- 不管是
Roof
、Window
、Wall
、Window
還是Door
都可以根據自己的喜歡定制自己的樣式風格,而這些風格對應的就是React組件中的props
(Property
的縮寫)。愛掏網 - it200.com如果換到HTML中來的話,props
就相當于HTML標簽元素的屬性(即attributes
) - 對于
Window
和Door
而言除了可以定制自己喜歡的風格之外還有其他的狀態,比如說他們是關閉狀態還是打開狀態。愛掏網 - it200.com 相應的,在React中,我們可以通過state
來控制
要是用一句話來描述的話:
看上去是一句簡單的話,但對于React的初學者而言,props
和state
是復雜的。愛掏網 - it200.com既然他們是復雜的,我們就有必要一步一步的來分析和學習他們,只有這樣我們才能更好的掌握好React。愛掏網 - it200.com
在React組件中,state
是影響組件渲染的內部數據集。愛掏網 - it200.com在一定程度上,state
可以看作是React組件的私有數據或數據模型。愛掏網 - it200.comReact組件state
是可變的。愛掏網 - it200.com當React組件的內部state
改變后,組件將根據新的狀態重新渲染自己。愛掏網 - it200.com比如Window
和Door
可以是關閉的也可以是打開的。愛掏網 - it200.com
而props
是React組件的屬性,看起來像HTML屬性(Attributes
)。愛掏網 - it200.com在React組件中的props
的值通常從父組件中傳遞。愛掏網 - it200.com
props
是properties
的簡寫,可以被定義為一種數據從組件傳遞到組件的方式,基本上就是從父組件傳遞到子組件。愛掏網 - it200.com將一個數據從一個React組件傳遞到另一個組件,主要是因為不想讓組件渲染靜態數據,而是將動態數據傳遞給組件。愛掏網 - it200.com這也正是React的props
發揮其作用的地方。愛掏網 - it200.com
同樣拿@Linton Ye創建的房子來說,你可能創建多幢房子,但又不希望這些房子是千篇一律的。愛掏網 - it200.com你可能喜歡紅色的房頂,他可能喜歡藍色的房頂,還有人喜歡粉紅色的房頂。愛掏網 - it200.com那么我們就可以通過給House
組件透傳一個props
的值來控制房頂Roof
的顏色。愛掏網 - it200.com比如下面這樣的一個示例:
詳細代碼請參考上面的示例,下面列出關鍵性代碼。愛掏網 - it200.com根據不同用戶的喜好,創建的房子有可能房頂顏色會不一樣。愛掏網 - it200.com也就是說顏色color
是一個動態的。愛掏網 - it200.com在這里我們可以通過給House
組件透傳一個props
屬性值讓用戶可以根據自己喜歡配置房頂顏色:
const Roof = ({color}) => {
return
}
const House = (props) => {
return (
)
}
const App = () => {
return (
>
)
}
你可能已經看到了,blue
、red
和salmon
值傳給了color
屬性(簡稱props
),即這些值分別傳遞給
組件。愛掏網 - it200.com
甚至我們可以更激進一些。愛掏網 - it200.com比如我們希望房子除了房頂不一樣之外,還可以其他部件不一樣。愛掏網 - it200.com簡單地說,
組件的其他部位也可以像房頂一樣通過props
來透傳。愛掏網 - it200.com就上面的示例,我們可以像下面這樣來進行改造:
// 創建房頂組件
const Roof = ({color, roofSrc}) => {
return
}
// 創建墻
const Wall = ({wallSrc}) => {
return ;
}
// 創建窗戶
const Window = ({windowSrc}) => {
return ;
}
// 創建門
const Door = ({doorSrc}) => {
return ;
}
// 創建房子
const House = (props) => {
return (
)
}
const App = () => {
return (
)
}
你將看到的效果如下:
另外,在React中不能直接將屬性傳遞給目標組件。愛掏網 - it200.com這是因為React遵循這樣的規則:
這意味著在發送屬性時不能跳過子組件層,子組件也不能將屬性發送回父組件。愛掏網 - it200.com在實際使用的時候,還可以使用默認的props
值,以防父組件沒有向下傳遞props
。愛掏網 - it200.com比如上面的示例,我們就可以給每個子組件設置一個默認的props
值:
const House = (props) => {
// 聲明房子默認需要的屬性值
const IMAGES = {
roof: '/uploads/allimg/191028/055319E22-3.png?1515785259159',
wall: '/uploads/allimg/191028/05531a638-4.png?1501113882297',
window: '/uploads/allimg/191028/0553193240-5.png?