主頁 >  其他 > 前端面試高頻React題及詳解,另附有React面試題集合

前端面試高頻React題及詳解,另附有React面試題集合

2021-07-23 07:05:21 其他

之前小編發過一篇類似的文章,前端面試Vue 高頻原理篇+詳細解答,還有105道vue面試題集合,整合了Vue面試題,這次整合了React面試題,兩份面試題集合都可以點擊這獲取哦

為什么選擇使用框架而不是原生?

框架的好處:

1.組件化: 其中以 React 的組件化最為徹底,甚至可以到函式級別的原子組件,高度的組件化可以是我們的工程易于維護、易于組合拓展,

2.天然分層: JQuery`時代的代碼大部分情況下是面條代碼,耦合嚴重,現代框架不管是 MVC、MVP還是MVVM 模式都能幫助我們進行分層,代碼解耦更易于讀寫,

3.生態: 現在主流前端框架都自帶生態,不管是資料流管理架構還是 UI 庫都有成熟的解決方案,

4.開發效率: 現代前端框架都默認自動更新DOM,而非我們手動操作,解放了開發者的手動DOM成本,提高開發效率,從根本上解決了UI 與狀態同步問題.

虛擬DOM的優劣如何?

優點:

  • 保證性能下限: 虛擬DOM可以經過diff找出最小差異,然后批量進行patch,這種操作雖然比不上手動優化,但是比起粗暴的DOM操作性能要好很多,因此虛擬DOM可以保證性能下限
  • 無需手動操作DOM: 虛擬DOM的diff和patch都是在一次更新中自動進行的,我們無需手動操作DOM,極大提高開發效率
  • 跨平臺: 虛擬DOM本質上是JavaScript物件,而DOM與平臺強相關,相比之下虛擬DOM可以進行更方便地跨平臺操作,例如服務器渲染、移動端開發等等

缺點:

  • 無法進行極致優化: 在一些性能要求極高的應用中虛擬DOM無法進行針對性的極致優化,比如VScode采用直接手動操作DOM的方式進行極端的性能優化

虛擬DOM實作原理?

  • 虛擬DOM本質上是JavaScript物件,是對真實DOM的抽象
  • 狀態變更時,記錄新樹和舊樹的差異
  • 最后把差異更新到真正的dom中

React的請求應該放在哪個生命周期中?

React的異步請求到底應該放在哪個生命周期里,有人認為在componentWillMount中可以提前進行異步請求,避免白屏,其實這個觀點是有問題的.

由于JavaScript中異步事件的性質,當您啟動API呼叫時,瀏覽器會在此期間回傳執行其他作業,當React渲染一個組件時,它不會等待componentWillMount它完成任何事情 - React繼續前進并繼續render,沒有辦法“暫停”渲染以等待資料到達,

而且在componentWillMount請求會有一系列潛在的問題,首先,在服務器渲染時,如果在 componentWillMount 里獲取資料,fetch data會執行兩次,一次在服務端一次在客戶端,這造成了多余的請求,其次,在React 16進行React Fiber重寫后,componentWillMount可能在一次渲染中多次呼叫.

目前官方推薦的異步請求是在componentDidmount中進行.

如果有特殊需求需要提前請求,也可以在特殊情況下在constructor中請求:

setState到底是異步還是同步?

先給出答案: 有時表現出異步,有時表現出同步

1.setState只在合成事件和鉤子函式中是“異步”的,在原生事件和setTimeout 中都是同步的,

2.setState 的“異步”并不是說內部由異步代碼實作,其實本身執行的程序和代碼都是同步的,只是合成事件和鉤子函式的呼叫順序在更新之前,導致在合成事件和鉤子函式中沒法立馬拿到更新后的值,形成了所謂的“異步”,當然可以通過第二個引數 setState(partialState, callback) 中的callback拿到更新后的結果,

3.setState 的批量更新優化也是建立在“異步”(合成事件、鉤子函式)之上的,在原生事件和setTimeout 中不會批量更新,在“異步”中如果對同一個值進行多次setState,setState的批量更新策略會對其進行覆寫,取最后一次的執行,如果是同時setState多個不同的值,在更新時會對其進行合并批量更新,

React組件通信如何實作?

React組件間通信方式:

  • 父組件向子組件通訊: 父組件可以向子組件通過傳 props 的方式,向子組件進行通訊
  • 子組件向父組件通訊: props+回呼的方式,父組件向子組件傳遞props進行通訊,此props為作用域為父組件自身的函式,子組件呼叫該函式,將子組件想要傳遞的資訊,作為引數,傳遞到父組件的作用域中
  • 兄弟組件通信: 找到這兩個兄弟節點共同的父節點,結合上面兩種方式由父節點轉發資訊進行通信
  • 跨層級通信: Context設計目的是為了共享那些對于一個組件樹而言是“全域”的資料,例如當前認證的用戶、主題或首選語言,對于跨越多層的全域資料通過Context通信再適合不過
  • 發布訂閱模式: 發布者發布事件,訂閱者監聽事件并做出反應,我們可以通過引入event模塊進行通信
  • 全域狀態管理工具: 借助Redux或者Mobx等全域狀態管理工具進行通信,這種工具會維護一個全域狀態中心Store,并根據不同的事件產生新的狀態

redux的作業流程?

首先,我們看下幾個核心概念:

  • Store: 保存資料的地方,你可以把它看成一個容器,整個應用只能有一個Store,
  • State: Store物件包含所有資料,如果想得到某個時點的資料,就要對Store生成快照,這種時點的資料集合,就叫做State,
  • Action: State的變化,會導致View的變化,但是,用戶接觸不到State,只能接觸到View,所以,State的變化必須是View導致的,Action就是View發出的通知,表示State應該要發生變化了,
  • Action Creator: View要發送多少種訊息,就會有多少種Action,如果都手寫,會很麻煩,所以我們定義一個函式來生成Action,這個函式就叫Action Creator,
  • Reducer: Store收到Action以后,必須給出一個新的State,這樣View才會發生變化,這種State的計算程序就叫做Reducer,Reducer是一個函式,它接受Action和當前State作為引數,回傳一個新的State,
  • dispatch: 是View發出Action的唯一方法,

然后我們過下整個作業流程:
1.首先,用戶(通過View)發出Action,發出方式就用到了dispatch方法,

2.然后,Store自動呼叫Reducer,并且傳入兩個引數:當前State和收到的Action,Reducer會回傳新的State

3.State一旦有變化,Store就會呼叫監聽函式,來更新View,

到這兒為止,一次用戶互動流程結束,可以看到,在整個流程中資料都是單向流動的,這種方式保證了流程的清晰,

react-redux是如何作業的?

  • Provider: Provider的作用是從最外部封裝了整個應用,并向connect模塊傳遞store
  • connect: 負責連接React和Redux

1.獲取state: connect通過context獲取Provider中的store,通過store.getState()獲取整個store tree 上所有state

2.包裝原組件: 將state和action通過props的方式傳入到原組件內部wrapWithConnect回傳一個ReactComponent物件Connect,Connect重新render外部傳入的原組件WrappedComponent,并把connect中傳入的mapStateToProps, mapDispatchToProps與組件上原有的props合并后,通過屬性的方式傳給WrappedComponent

3.監聽store tree變化: connect快取了store tree中state的狀態,通過當前state狀態和變更前state狀態進行比較,從而確定是否呼叫this.setState()方法觸發Connect及其子組件的重新渲染

redux與mobx的區別?

兩者對比:

  • redux將資料保存在單一的store中,mobx將資料保存在分散的多個store中
  • redux使用plain object保存資料,需要手動處理變化后的操作;mobx適用observable保存資料,資料變化后自動處理回應的操作
  • redux使用不可變狀態,這意味著狀態是只讀的,不能直接去修改它,而是應該回傳一個新的狀態,同時使用純函式;- - - - mobx中的狀態是可變的,可以直接對其進行修改
  • mobx相對來說比較簡單,在其中有很多的抽象,mobx更多的使用面向物件的編程思維;redux會比較復雜,因為其中的函式式編程思想掌握起來不是那么容易,同時需要借助一系列的中間件來處理異步和副作用
  • mobx中有更多的抽象和封裝,除錯會比較困難,同時結果也難以預測;而redux提供能夠進行時間回溯的開發工具,同時其純函式以及更少的抽象,讓除錯變得更加的容易

場景辨析:
基于以上區別,我們可以簡單得分析一下兩者的不同使用場景.

mobx更適合資料不復雜的應用: mobx難以除錯,很多狀態無法回溯,面對復雜度高的應用時,往往力不從心.

redux適合有回溯需求的應用: 比如一個畫板應用、一個表格應用,很多時候需要撤銷、重做等操作,由于redux不可變的特性,天然支持這些操作.

mobx適合短平快的專案: mobx上手簡單,樣板代碼少,可以很大程度上提高開發效率.
當然mobx和redux也并不一定是非此即彼的關系,你也可以在專案中用redux作為全域狀態管理,用mobx作為組件區域狀態管理器來用.

redux中如何進行異步操作?

當然,我們可以在componentDidmount中直接進行請求無須借助redux.

但是在一定規模的專案中,上述方法很難進行異步流的管理,通常情況下我們會借助redux的異步中間件進行異步處理.

redux異步流中間件其實有很多,但是當下主流的異步中間件只有兩種redux-thunk、redux-saga,當然redux-observable可能也有資格占據一席之地,其余的異步中間件不管是社區活躍度還是npm下載量都比較差了,

redux異步中間件之間的優劣?

redux-thunk優點:

  • 體積小: redux-thunk的實作方式很簡單,只有不到20行代碼
  • 使用簡單: redux-thunk沒有引入像redux-saga或者redux-observable額外的范式,上手簡單

redux-thunk缺陷:

  • 樣板代碼過多: 與redux本身一樣,通常一個請求需要大量的代碼,而且很多都是重復性質的
  • 耦合嚴重: 異步操作與redux的action偶合在一起,不方便管理
  • 功能孱弱: 有一些實際開發中常用的功能需要自己進行封裝

redux-saga優點:

  • 異步解耦: 異步操作被被轉移到單獨 saga.js 中,不再是摻雜在 action.js 或 component.js 中
    action擺脫thunk function: dispatch 的引數依然是一個純粹的 action (FSA),而不是充滿 “黑魔法” thunk function
  • 例外處理: 受益于 generator function 的 saga 實作,代碼例外/請求失敗 都可以直接通過 try/catch 語法直接捕獲處理
  • 功能強大: redux-saga提供了大量的Saga 輔助函式和Effect 創建器供開發者使用,開發者無須封裝或者簡單封裝即可使用
  • 靈活: redux-saga可以將多個Saga可以串行/并行組合起來,形成一個非常實用的異步flow
    易測驗,提供了各種case的測驗方案,包括mock task,分支覆寫等等

redux-saga缺陷:

  • 額外的學習成本: redux-saga不僅在使用難以理解的 generator function,而且有數十個API,學習成本遠超redux-thunk,最重要的是你的額外學習成本是只服務于這個庫的,與redux-observable不同,redux-observable雖然也有額外學習成本但是背后是rxjs和一整套思想
  • 體積龐大: 體積略大,代碼近2000行,min版25KB左右
  • 功能過剩: 實際上并發控制等功能很難用到,但是我們依然需要引入這些代碼
  • ts支持不友好: yield無法回傳TS型別

redux-observable優點:

  • 功能最強: 由于背靠rxjs這個強大的回應式編程的庫,借助rxjs的運算子,你可以幾乎做任何你能想到的異步處理
  • 背靠rxjs: 由于有rxjs的加持,如果你已經學習了rxjs,redux-observable的學習成本并不高,而且隨著rxjs的升級redux-observable也會變得更強大

redux-observable缺陷:

  • 學習成本奇高: 如果你不會rxjs,則需要額外學習兩個復雜的庫
  • 社區一般: redux-observable的下載量只有redux-saga的1/5,社區也不夠活躍,在復雜異步流中間件這個層面redux-saga仍處于領導地位

React面試題集合

基本知識

  • 區分Real DOM和Virtual DOM
  • 什么是React?
  • React有什么特點?
  • 列出React的一些主要優點,
  • React有哪些限制?
  • 什么是JSX?

React 組件

  • 你理解“在React中,一切都是組件”這句話,
  • 解釋 React 中 render() 的目的,
  • 如何將兩個或多個組件嵌入到一個組件中?
  • 什么是 Props?
  • React中的狀態是什么?它是如何使用的?
  • 區分狀態和 props

React Redux

  • MVC框架的主要問題是什么?
  • 解釋一下 Flux
  • 什么是Redux?
  • Redux遵循的三個原則是什么?
  • 你對“單一事實來源”有什么理解?
  • 列出 Redux 的組件,

React 路由

  • 什么是React 路由?
  • 為什么React Router v4中使用 switch 關鍵字 ?
  • 為什么需要 React 中的路由?
  • 列出 React Router 的優點,
  • React Router與常規路由有何不同?


完整版的React面試題集合PDF資料直接點擊這里就可以領取了哦, 整理不易,還請點贊評論支持小編,給小編充充能量,謝謝哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289508.html

標籤:其他

上一篇:2021,我年過30,測驗行業求職危機也降臨到我頭上了···

下一篇:【Python自學筆記】10個爬蟲入門實體,附原始碼,注釋對新手友好

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more