面試題集二 ——react相關(guān)

1. react 虛擬DOM

  1. 將代碼轉(zhuǎn)換成JS對(duì)象惨险,然后由JS對(duì)象轉(zhuǎn)換成真實(shí)DOM
  2. 如果是首次渲染,其實(shí)vitruaDom不具有任何優(yōu)勢(shì)宰衙,甚至更加消耗內(nèi)存平道,但是它的優(yōu)勢(shì)在于diff算法和批量處理策略
  3. react基于virtialdom自己實(shí)現(xiàn)了一套事件機(jī)制自己模擬事件冒泡,捕獲供炼,采用事件代理,批量更新窘疮,解決兼容性問(wèn)題袋哼,它將virtualdom上的事件映射到真實(shí)的Dom事件,然后將所有的事件都代理到document上闸衫,進(jìn)行統(tǒng)一分發(fā)
  4. react.createElement 將 props,children , 進(jìn)行批量處理涛贯,傳遞給reactElement
  5. $$typeof 是一個(gè)symbol類(lèi)型的變量,可以防止xss攻擊蔚出,由于json中是不能存儲(chǔ)symbol對(duì)象的
    (xss:它是通過(guò)對(duì)網(wǎng)頁(yè)注入可執(zhí)行代碼且成功地被瀏覽器 執(zhí)行弟翘,達(dá)到攻擊的目的)

2. react 渲染流程

  1. 使用react.createElement /JSX 編寫(xiě)文件最后都會(huì)通過(guò)babel轉(zhuǎn)換成 createElement
  2. createElement 對(duì)key和ref等props做了處理虫腋,獲取defaultProps對(duì)默認(rèn)props進(jìn)行復(fù)制,對(duì)傳入的子節(jié)點(diǎn)處理稀余,最后形成虛擬dom
  3. reactdom.render將生成好的虛擬dom渲染指定容器上悦冀,然后采用了批量處理,事務(wù)機(jī)制等對(duì)指定瀏覽器進(jìn)行性能優(yōu)化睛琳,最后轉(zhuǎn)換成DOM

3.setstate

調(diào)用setstate不用立即更新
setstate本身不是異步的盒蟆,只是在調(diào)用setstate的時(shí)候,如果react處于更新?tīng)顟B(tài)师骗。當(dāng)前更新會(huì)暫停历等,等上一次更新執(zhí)行后在執(zhí)行


BH4JE_KPRLTQ@6RFS{`XG6A.png

4. bind(this)

  1. 由于在調(diào)用事件過(guò)程中并沒(méi)有指定調(diào)用的組件所以需要手動(dòng)綁定,否則this = undefined
  2. 箭頭函數(shù)不會(huì)創(chuàng)建自己的this,它只會(huì)從自己作用域上一層繼承this

5. react事件執(zhí)行順序

1.由于react的所有事件都是掛載到document上的辟癌,當(dāng)真實(shí)的dom觸發(fā)冒泡寒屯,到document后才會(huì)對(duì)react事件進(jìn)行處理

  1. 先執(zhí)行原生的事件
  2. 然后執(zhí)行react合成事件
  3. 最后執(zhí)行真正在document上掛載的事件

6. mixin , hook, hoc

  1. mixin:混入
    將一個(gè)對(duì)象的屬性拷貝到另一個(gè)對(duì)象上,可以是多個(gè)黍少,也可以是一個(gè)浩螺,這是extends無(wú)法實(shí)現(xiàn)的。
    缺點(diǎn):1. mixin 可能會(huì)相互依賴(lài)仍侥,相互耦合要出,不利于后期的維護(hù),2. 不同的mixin中的方法會(huì)沖突
  2. hoc
  • 渲染劫持
  • 操作props / state 农渊,獲取refs
  • 狀態(tài)管理
    hoc實(shí)現(xiàn)功能
  • 通過(guò)原組件和其他組件進(jìn)行組合渲染可以達(dá)到樣式布局復(fù)用
  • 屬性代理
  • 反向代理 -- super.render()
  • 根據(jù)特定屬性覺(jué)得原組件是否渲染
    基本用途: 日志打點(diǎn) / 權(quán)限控制 / 實(shí)現(xiàn)雙向綁定(利用hoc 代理onchange方法和value屬性)/ 表單校驗(yàn) 患蹂。。砸紊。
  • 實(shí)例:
    redux中的connect其實(shí)就是將mapStateTOProps 和 mapDispatchToProps分別解構(gòu)后傳遞給原組件传于,這樣就可以在原組件內(nèi)直接通過(guò)props獲取到state和dispatch函數(shù)
  • 優(yōu)點(diǎn)
    高級(jí)組件時(shí)一個(gè)沒(méi)有副作用的純函數(shù),各個(gè)高階組件不會(huì)互相依賴(lài)耦合
    高階組件并不關(guān)心數(shù)據(jù)使用的方式和原因醉顽,而被包裹的組件也不關(guān)心數(shù)據(jù)的來(lái)源
  • 缺點(diǎn)
    hoc可以劫持props ,在不遵守約定的情況下會(huì)造成沖突
    如果大量使用沼溜,對(duì)調(diào)試會(huì)由很多困難由于多層嵌套
  1. hooks
    只能在函數(shù)式中使用
  • 優(yōu)勢(shì):
    減少狀態(tài)邏輯復(fù)用的風(fēng)險(xiǎn)
    避免地獄式嵌套
    使用函數(shù)代替class

7. redux

  • redux的可預(yù)測(cè)性:1. 單一的數(shù)據(jù)源,應(yīng)用只能有一個(gè)store. 2. 所有數(shù)據(jù)都是只讀的游添,要想更新數(shù)據(jù)系草,必須dispatch一個(gè)action來(lái)更新3. 當(dāng)處理action的時(shí)候,不得直接修改原始對(duì)象必須生成一個(gè)新的state
  • reducer是純函數(shù):同樣的輸入必定得到同樣的輸出唆涝,就可以保證同樣的state就一定得到童話(huà)貴陽(yáng)的view找都,所以reducer里不能改變state,只能返回一個(gè)權(quán)限的state對(duì)象
  • redux設(shè)計(jì)思想:web應(yīng)用是一個(gè)狀態(tài)機(jī)制廊酣,視圖和狀態(tài)是一一對(duì)應(yīng)的能耻。所有的狀態(tài),保存在一個(gè)對(duì)象里面。
  • Redux是如何將state注入到React組件上的: provider組件晓猛,將store傳遞給provider饿幅,通過(guò)connect接受、state和mapDispatchToProps

8. react新特性

  • Error Bounday
    如果組件發(fā)生錯(cuò)誤戒职,可以通過(guò)error boundary捕獲優(yōu)雅處理 配合使用了以惡新生命周期 componentDidCatch
  • render新增了返回的值類(lèi)型:支持string / number / boolean / null / portal /fragment
  • portals可以把組件渲染到當(dāng)前組件之外栗恩,多用于彈框之類(lèi)的
  • setstate傳入null就不會(huì)發(fā)生更新
  • 更好的服務(wù)器渲染 ,由于15的三倍
  • 采用了新的核心架構(gòu)帕涌,fiber 將原來(lái)的同步更新轉(zhuǎn)變成更新過(guò)程碎片化摄凡,避免長(zhǎng)時(shí)間阻塞主線程使得應(yīng)用渲染更加流暢
  • 支持自定義dom
  • 減少文件體積,從 161.7kb -> 109kb
  • call return (react-call-return npm)
    解決了父組件需要跟據(jù)子組件的回調(diào)信息去渲染子組件
  • fragment
    將一些子元素添加到dom tree蚓曼,不需要為這些元素提供額外的父節(jié)點(diǎn)
  • createRef / forwardRef
    通過(guò)createRef獲取red對(duì)象 forwardRef是ref的轉(zhuǎn)發(fā)可以讓父組件獲得子組件的ref亲澡,從而操作子組件
  • 生命周期更新
    增加了getDerivedStateFromProps(nextprops,prestate)

9. diff算法

在調(diào)用react renderd 的時(shí)候,會(huì)創(chuàng)建react元素組成的樹(shù)纫版,在下一次床绪,state和props更新的時(shí)候,相同的render會(huì)返回不同的樹(shù)其弊,就需要不叫這兩棵樹(shù)的差別癞己,常規(guī)操作一般需要的算法的復(fù)雜度o(n^3),但是一旦元素過(guò)多則會(huì)開(kāi)銷(xiāo)過(guò)大,造成頁(yè)面卡頓梭伐,所以痹雅,react提出了兩個(gè)假設(shè):

  1. 兩個(gè)不停類(lèi)型的元素會(huì)產(chǎn)生不同的樹(shù)
  2. 開(kāi)發(fā)者可以通過(guò)key,props來(lái)暗示哪些子元素在不同的渲染下保持穩(wěn)定
    這樣算法的復(fù)雜度就是o(n)
    可以分為: tree diff / component diff /element diff
  • tree diff
    react為了讓運(yùn)行效率更高糊识,tree diff只對(duì)樹(shù)進(jìn)行同層對(duì)比绩社,不去比較跨層的節(jié)點(diǎn)。
  • component diff
    同一層只要出現(xiàn)不是同一類(lèi)型的組件赂苗,就替換該組件的所有子節(jié)點(diǎn)愉耙。
  • element diff
    主要是根據(jù)mountIndex和lastIndex進(jìn)行比較,在確定是否移動(dòng) 拌滋,
    https://segmentfault.com/a/1190000010686582
  1. useEffect 和useLauoutEffect區(qū)別
    useEffect和useLayoutEffect的執(zhí)行時(shí)機(jī)不一樣朴沿,前者被異步調(diào)度,當(dāng)頁(yè)面渲染完成后再去執(zhí)行败砂,不會(huì)阻塞頁(yè)面渲染赌渣。 后者是在commit階段新的DOM準(zhǔn)備完成,但還未渲染到屏幕之前吠卷,同步執(zhí)行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锡垄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子祭隔,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疾渴,死亡現(xiàn)場(chǎng)離奇詭異千贯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)搞坝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)搔谴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人桩撮,你說(shuō)我怎么就攤上這事敦第。” “怎么了店量?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵芜果,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我融师,道長(zhǎng)右钾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任旱爆,我火速辦了婚禮舀射,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怀伦。我一直安慰自己脆烟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布房待。 她就那樣靜靜地躺著邢羔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吴攒。 梳的紋絲不亂的頭發(fā)上张抄,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音洼怔,去河邊找鬼署惯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镣隶,可吹牛的內(nèi)容都是我干的极谊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼安岂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼轻猖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起域那,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咙边,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體败许,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡王带,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了市殷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愕撰。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖醋寝,靈堂內(nèi)的尸體忽然破棺而出搞挣,到底是詐尸還是另有隱情,我是刑警寧澤音羞,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布囱桨,位于F島的核電站,受9級(jí)特大地震影響黄选,放射性物質(zhì)發(fā)生泄漏蝇摸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一办陷、第九天 我趴在偏房一處隱蔽的房頂上張望貌夕。 院中可真熱鬧,春花似錦民镜、人聲如沸啡专。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)们童。三九已至,卻和暖如春鲸鹦,著一層夾襖步出監(jiān)牢的瞬間慧库,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工馋嗜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留齐板,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓葛菇,卻偏偏與公主長(zhǎng)得像甘磨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眯停,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,064評(píng)論 2 35
  • 原教程內(nèi)容詳見(jiàn)精益 React 學(xué)習(xí)指南济舆,這只是我在學(xué)習(xí)過(guò)程中的一些閱讀筆記,個(gè)人覺(jué)得該教程講解深入淺出莺债,比目前大...
    leonaxiong閱讀 2,834評(píng)論 1 18
  • 今天的React題沒(méi)有太多的故事…… 半個(gè)月前出了248個(gè)Vue的知識(shí)點(diǎn)滋觉,受到很多朋友的關(guān)注签夭,都強(qiáng)烈要求再出多些R...
    浪子神劍閱讀 10,082評(píng)論 6 106
  • React 中 keys 的作用是什么? Keys 是 React 用于追蹤哪些列表中元素被修改椎瘟、被添加或者被移除...
    e2ee31170666閱讀 1,296評(píng)論 1 3
  • 40覆致、React 什么是React侄旬?React 是一個(gè)用于構(gòu)建用戶(hù)界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,016評(píng)論 0 1