前端面試之React

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í)行的副作用够话。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市光绕,隨后出現(xiàn)的幾起案子女嘲,更是在濱河造成了極大的恐慌,老刑警劉巖诞帐,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欣尼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡停蕉,警方通過查閱死者的電腦和手機(jī)愕鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谷徙,“玉大人拒啰,你說我怎么就攤上這事⊥昊郏” “怎么了谋旦?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵剩失,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我册着,道長(zhǎng)拴孤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任甲捏,我火速辦了婚禮演熟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘司顿。我一直安慰自己芒粹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布大溜。 她就那樣靜靜地躺著化漆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钦奋。 梳的紋絲不亂的頭發(fā)上座云,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音付材,去河邊找鬼朦拖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厌衔,可吹牛的內(nèi)容都是我干的璧帝。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼富寿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裸弦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起作喘,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晕城,沒想到半個(gè)月后泞坦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砖顷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贰锁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滤蝠。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豌熄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出物咳,到底是詐尸還是另有隱情锣险,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站芯肤,受9級(jí)特大地震影響巷折,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜崖咨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一锻拘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧击蹲,春花似錦署拟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至世曾,卻和暖如春缨恒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轮听。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工骗露, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人血巍。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓萧锉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親述寡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柿隙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容