1.列表組件中寫key的作用是什么
簡(jiǎn)單無(wú)狀態(tài)的列表不使用key其實(shí)更快。在diff算法里,比較新的vnode和舊的vnode有key的情況下是通過鍵值對(duì)map映射的方式獲取舊vnode去和新的做比較粗截,沒有key值的情況下是通過遍歷的方式去對(duì)比的。
2.react diff算法
React diff算法是React中用于比較兩棵虛擬DOM樹的算法含滴。當(dāng)React應(yīng)用中的數(shù)據(jù)發(fā)生變化時(shí)氢拥,React會(huì)重新構(gòu)建虛擬DOM樹,并通過diff算法來(lái)對(duì)新舊虛擬DOM樹進(jìn)行比較暂刘,找出兩棵樹之間的差異饺谬,然后將這些差異應(yīng)用到實(shí)際的DOM上,從而實(shí)現(xiàn)頁(yè)面的更新谣拣。
React 通過制定大膽的 diff 策略募寨,將 O(n3) 復(fù)雜度的問題轉(zhuǎn)換成 O(n) 復(fù)雜度的問題;
React 通過分層求異的策略森缠,對(duì) tree diff 進(jìn)行算法優(yōu)化拔鹰;
React 通過相同類生成相似樹形結(jié)構(gòu),不同類生成不同樹形結(jié)構(gòu)的策略贵涵,對(duì) component diff 進(jìn)行算法優(yōu)化列肢;
React 通過設(shè)置唯一 key的策略,對(duì) element diff 進(jìn)行算法優(yōu)化宾茂;
3.虛擬DOM
虛擬DOM可以看做一棵模擬了DOM樹的JavaScript對(duì)象樹
在傳統(tǒng)的 Web 應(yīng)用中瓷马,我們往往會(huì)把數(shù)據(jù)的變化實(shí)時(shí)地更新到用戶界面中,于是每次數(shù)據(jù)的微小變動(dòng)都會(huì)引起 DOM 樹的重新渲染刻炒。
虛擬DOM的目的是將所有操作累加起來(lái)决采,統(tǒng)計(jì)計(jì)算出所有的變化后,統(tǒng)一更新一次DOM坟奥。
當(dāng)Node節(jié)點(diǎn)的更新树瞭,虛擬DOM會(huì)比較兩棵DOM樹的區(qū)別,保證最小化的DOM操作爱谁,使得執(zhí)行效率得到保證晒喷。
4 redux
將整個(gè)應(yīng)用狀態(tài)存儲(chǔ)到store,store里存在一個(gè)狀態(tài)輸 state store
組件通過 store dispatch派發(fā)行為action給store访敌,store不會(huì)直接修改state,通過用戶編寫的reducer來(lái)生存新的state凉敲,并返回給store
其他組件通過訂閱store的的state狀態(tài)來(lái)刷新試圖
整個(gè)應(yīng)用之一一個(gè)store,內(nèi)部的statetree存儲(chǔ)整個(gè)應(yīng)用的state
state是只讀的,修改state只能通過派發(fā)action爷抓,需要通過reducers純函數(shù)描述action如何修改state
單一數(shù)據(jù)源的設(shè)計(jì)讓react組件之間通信更加方便势决,也有利于狀態(tài)的統(tǒng)一管理
5.hooks
Hooks 是 React 16.8 版本引入的一項(xiàng)特性,它允許在函數(shù)式組件中使用狀態(tài)和其他 React 特性蓝撇,而不需要使用類組件果复。Hooks 就是鉤子,作用是把某個(gè)目標(biāo)結(jié)果鉤到某個(gè)可能會(huì)變化的數(shù)據(jù)源或者事件源上渤昌,那么當(dāng)被鉤到的數(shù)據(jù)或事件發(fā)生變化時(shí)虽抄,產(chǎn)生這個(gè)目標(biāo)結(jié)果的代碼會(huì)重新執(zhí)行,產(chǎn)生更新后的結(jié)果独柑。
解決高階類組件復(fù)用迈窟,導(dǎo)致代碼層級(jí)復(fù)雜問題。
React 組件生命周期的復(fù)雜忌栅,用于代替生命周期函數(shù)车酣。
如果一個(gè)類一開始設(shè)計(jì)成了 function 組件,無(wú)狀態(tài)組件狂秘,因?yàn)樾枰獱顟B(tài)骇径,又改成了 class 成本高。
6.useCallback,useMemo
useCallback 主要用于緩存函數(shù)者春,而不是函數(shù)的結(jié)果。當(dāng)組件的狀態(tài)(state)或?qū)傩裕╬rops)發(fā)生變化時(shí)清女,如果某個(gè)函數(shù)不需要重新定義钱烟,可以使用 useCallback 來(lái)緩存這個(gè)函數(shù),避免子組件的不必要重新渲染嫡丙。這有助于減少函數(shù)每次父組件渲染時(shí)的重新創(chuàng)建拴袭,特別是在將函數(shù)作為參數(shù)傳遞給子組件時(shí)。
useMemo 則主要用于緩存計(jì)算結(jié)果或值曙博。當(dāng)某個(gè)計(jì)算過程非常耗時(shí)拥刻,且結(jié)果在多次渲染中保持不變時(shí),可以使用 useMemo 來(lái)存儲(chǔ)這個(gè)計(jì)算結(jié)果父泳,避免重復(fù)計(jì)算般哼。這適用于需要在組件渲染過程中避免高開銷計(jì)算的情況。
7. memoization
Memoization 的原理就是把函數(shù)的每次執(zhí)行結(jié)果都放入一個(gè)對(duì)象中惠窄,在接下來(lái)的執(zhí)行中蒸眠,在對(duì)象中查找是否已經(jīng)有相應(yīng)執(zhí)行過的值,如果有杆融,直接返回該值楞卡,沒有才真正執(zhí)行函數(shù)體的求值部分。在對(duì)象里找值是要比執(zhí)行函數(shù)的速度要快的。
另外蒋腮,Memoization 只適用于確定性算法淘捡,對(duì)于相同的輸入總是生成相同的輸出,即純函數(shù)池摧。
8.fiber
作為架構(gòu)來(lái)說焦除,在舊的架構(gòu)中,Reconciler(協(xié)調(diào)器)采用遞歸的方式執(zhí)行险绘,無(wú)法中斷踢京,節(jié)點(diǎn)數(shù)據(jù)保存在遞歸的調(diào)用棧中,被稱為 Stack Reconciler宦棺,stack 就是調(diào)用棧瓣距;在新的架構(gòu)中,Reconciler(協(xié)調(diào)器)是基于fiber實(shí)現(xiàn)的代咸,節(jié)點(diǎn)數(shù)據(jù)保存在fiber中蹈丸,所以被稱為 fiber Reconciler。
作為靜態(tài)數(shù)據(jù)結(jié)構(gòu)來(lái)說呐芥,每個(gè)fiber對(duì)應(yīng)一個(gè)組件逻杖,保存了這個(gè)組件的類型對(duì)應(yīng)的dom節(jié)點(diǎn)信息,這個(gè)時(shí)候思瘟,fiber節(jié)點(diǎn)就是我們所說的虛擬DOM荸百。
作為動(dòng)態(tài)工作單元來(lái)說,fiber節(jié)點(diǎn)保存了該節(jié)點(diǎn)需要更新的狀態(tài)滨攻,以及需要執(zhí)行的副作用够话。