1.keys的作用是什么娘荡?
keys是react用于追蹤列表元素被修改驶沼,添加或移除的標(biāo)識,我們需要保證元素的key在同級元素的唯一性回怜,react的diff算法會根據(jù)key的值來判斷該元素是新創(chuàng)建的還是移動的元素,減少不必要的渲染玉雾,增加性能
render(){
return(
this.state.list.map(item=>{
return (
<li key={item.id}>{item}</li>
)
})
)
}
2.調(diào)用setState后,發(fā)生了什么垦缅?
setState一般用戶更新數(shù)據(jù)驹碍,重新渲染dom元素壁涎。調(diào)用setState志秃,react會將傳入的參數(shù)和當(dāng)前組件的狀態(tài)合并,然后出發(fā)調(diào)和過程竟坛,經(jīng)過調(diào)和過程,react會以高效的方式根據(jù)新的狀態(tài)構(gòu)建react元素樹流码,并重新渲染界面延刘。react構(gòu)建樹之后漫试,react會計算出新樹和老樹的節(jié)點差異碘赖,然后根據(jù)差異進(jìn)行界面最小化的渲染,
3.生命周期
- 初始化階段
1.getDefaultProps:獲取實例的默認(rèn)屬性
2.getInitialState:獲取每個實例的初始狀態(tài)
3.componentWillMount:組件即將被裝載普泡,渲染頁面之前
4.render:組件生成虛擬DOM節(jié)點
5.componentDidMount:組件真正被裝載之后 - 運行中的
1.componentWillReceiveProps:組件將要接收到新的屬性調(diào)用
2.shouldComponentUpdate:組件接受到新屬性或者新狀態(tài)的時候(可以返回false,接受數(shù)據(jù)后就不更新。阻止render的調(diào)用歧匈,后面的函數(shù)就不會被執(zhí)行了)
3.componentWillUpdate:組件即將更新不能修改屬性和狀態(tài)
4.render:組件重新描繪
5.componentDidUpdate:組件已更新 - 銷毀階段
1.componentWillUnmount:組件即將銷毀
4.react性能優(yōu)化是那個周期函數(shù)
shouldComponentUpdate這個方法是用來判斷是否需要調(diào)用render方法重新渲染dom,因為渲染dom消耗性能砰嘁,如果能在shouldComponentUpdate方法中能寫出優(yōu)化的算法勘究,可以提高性能斟冕。
5.虛擬DOM
虛擬dom相當(dāng)于在js和真實dom中間加一個緩存口糕,利用dom diff算法避免了不必要的dom操作磕蛇,從而提高性能。用js對象結(jié)構(gòu)表示dom樹的結(jié)構(gòu)秀撇,然后用這個樹構(gòu)建一個真正的dom樹,插入到文檔中说搅,當(dāng)狀態(tài)變更時炸枣,重新構(gòu)造一個新的樹,然后用新的樹和舊的樹比較霍衫,記錄兩棵樹的差異。然后把差異部分更新敦跌。
6.diff原理
把樹形結(jié)構(gòu)按照層級分解逛揩,只比較同級元素。
給列表結(jié)構(gòu)的每個單元添加唯一的key屬性辩稽。
react只會匹配相同的class(組件)的component
選擇性子樹渲染,開發(fā)人員可以重寫shouldComponentUpdate提高diff的性能
合并操作逞泄。調(diào)用component的setState方法的時候,react將其標(biāo)記為dirty,到每一個時間循環(huán)結(jié)束喷众,react檢查所有標(biāo)記的dirty的component重新繪制
7.性能優(yōu)化方案
1.重寫shouldComponentUpdate來避免不必要的dom操作
2.使用production版本的react.js
3.使用key來幫助react識別列表的組件最小變化
8.refs的作用
refs是react提供給我們的安全訪問dom元素或者某個組件的實例化的句柄,我們可以為元素添加ref屬性然后再回調(diào)函數(shù)中接受該元素在dom樹種的句柄昌渤,該值會作為回調(diào)函數(shù)的第一個參數(shù)返回
9.state和props的不同之處
state是一種數(shù)據(jù)結(jié)構(gòu)憔四,用于組價掛載時所需數(shù)據(jù)的默認(rèn)值膀息,state可能會隨著時間的推移而發(fā)生沖突望抽,但多數(shù)是作為用戶事件行為的結(jié)果
props是組件的配置履婉,是由父組件傳遞給子組件,就子組件而言毁腿,props是不可變得,組件自身不能改變props,但是可以把其子組件的props統(tǒng)一管理鸠窗,props不僅僅是數(shù)據(jù),回調(diào)函數(shù)也可以通過props傳遞
10.react如何發(fā)起ajax請求
在react中應(yīng)該再componentDidMount發(fā)起網(wǎng)絡(luò)請求稍计,這個方法會在組件第一次掛載時執(zhí)行裕循,在組件的生命周期中僅會執(zhí)行一次臣嚣,因為你不能保證在組件掛載之前ajax請求已經(jīng)完成剥哑,如果是這樣,你將在一個未掛載的組件上調(diào)用setState怎虫,這將沒有效果。在componentDidMount中發(fā)起一個網(wǎng)絡(luò)請求大审,這就可以保證有一個組件可以更新了
11.高階組件
高階組件是一個以組件為參數(shù)并返回一個新組件的函數(shù)座哩,HOC運行你重用代碼、邏輯八回,HOC最好的方式是共享react組件之間的行為,如果你發(fā)現(xiàn)你在不同的地方寫了大量的代碼來做同一件事情缠诅,就應(yīng)該考慮將代碼重構(gòu)為可重用的HOC
12.調(diào)用super的作用?
在super()調(diào)用之前管引,子類是不能使用this的,在es5中谅将,子類必須在constructor中調(diào)用super().傳遞props給super()的原因則是在子類中能在constructor訪問this.props
13.react三中構(gòu)建組件的方式
React.createClass()
class XXX es6
無狀態(tài)函數(shù)