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