【react面試題】不可錯過的react 面試題 「務必收藏」

下面是一個常用的關于 React 的面試問題列表:

無論作為一個面試者,或者招聘官,下面這些問題都可以去參考

React 的工作原理

React 會創建一個虛擬 DOM(virtual DOM)。當一個組件中的狀態改變時,React 首先會通過 "diffing" 算法來標記虛擬 DOM 中的改變,第二步是調節(reconciliation),會用 diff 的結果來更新 DOM。

使用 React 有何優點

  • 只需查看 render 函數就會很容易知道一個組件是如何被渲染的
  • JSX 的引入,使得組件的代碼更加可讀,也更容易看懂組件的布局,或者組件之間是如何互相引用的
  • 支持服務端渲染,這可以改進 SEO 和性能
  • 易于測試
  • React 只關注 View 層,所以可以和其它任何框架(如Backbone.js, Angular.js)一起使用

展示組件(Presentational component)和容器組件(Container component)之間有何不同

展示組件關心組件看起來是什么。展示專門通過 props 接受數據和回調,并且幾乎不會有自身的狀態,但當展示組件擁有自身的狀態時,通常也只關心 UI 狀態而不是數據的狀態。

容器組件則更關心組件是如何運作的。容器組件會為展示組件或者其它容器組件提供數據和行為(behavior),它們會調用 Flux actions,并將其作為回調提供給展示組件。容器組件經常是有狀態的,因為它們是(其它組件的)數據源。

類組件(Class component)和函數式組件(Functional component)之間有何不同

  • 類組件不僅允許你使用更多額外的功能,如組件自身的狀態和生命周期鉤子,也能使組件直接訪問 store 并維持狀態
  • 當組件僅是接收 props,并將組件自身渲染到頁面時,該組件就是一個 '無狀態組件(stateless component)',可以使用一個純函數來創建這樣的組件。這種組件也被稱為啞組件(dumb components)或展示組件

(組件的)狀態(state)和屬性(props)之間有何不同

State 是一種數據結構,用于組件掛載時所需數據的默認值。State 可能會隨著時間的推移而發生突變,但多數時候是作為用戶事件行為的結果。

Props(properties 的簡寫)則是組件的配置。props 由父組件傳遞給子組件,并且就子組件而言,props 是不可變的(immutable)。組件不能改變自身的 props,但是可以把其子組件的 props 放在一起(統一管理)。Props 也不僅僅是數據--回調函數也可以通過 props 傳遞。

指出(組件)生命周期方法的不同

  • componentWillMount -- 多用于根組件中的應用程序配置
  • componentDidMount -- 在這可以完成所有沒有 DOM 就不能做的所有配置,并開始獲取所有你需要的數據;如果需要設置事件監聽,也可以在這完成
  • componentWillReceiveProps -- 這個周期函數作用于特定的 prop 改變導致的 state 轉換
  • shouldComponentUpdate -- 如果你擔心組件過度渲染,shouldComponentUpdate 是一個改善性能的地方,因為如果組件接收了新的 prop, 它可以阻止(組件)重新渲染。shouldComponentUpdate 應該返回一個布爾值來決定組件是否要重新渲染
  • componentWillUpdate -- 很少使用。它可以用于代替組件的 componentWillReceivePropsshouldComponentUpdate(但不能訪問之前的 props)
  • componentDidUpdate -- 常用于更新 DOM,響應 prop 或 state 的改變
  • componentWillUnmount -- 在這你可以取消網絡請求,或者移除所有與組件相關的事件監聽器

應該在 React 組件的何處發起 Ajax 請求

在 React 組件中,應該在 componentDidMount 中發起網絡請求。這個方法會在組件第一次“掛載”(被添加到 DOM)時執行,在組件的生命周期中僅會執行一次。更重要的是,你不能保證在組件掛載之前 Ajax 請求已經完成,如果是這樣,也就意味著你將嘗試在一個未掛載的組件上調用 setState,這將不起作用。在 componentDidMount 中發起網絡請求將保證這有一個組件可以更新了。

何為受控組件(controlled component)

在 HTML 中,類似 <input>, <textarea><select> 這樣的表單元素會維護自身的狀態,并基于用戶的輸入來更新。當用戶提交表單時,前面提到的元素的值將隨表單一起被發送。但在 React 中會有些不同,包含表單元素的組件將會在 state 中追蹤輸入的值,并且每次調用回調函數時,如 onChange 會更新 state,重新渲染組件。一個輸入表單元素,它的值通過 React 的這種方式來控制,這樣的元素就被稱為"受控元素"。

在 React 中,refs 的作用是什么

Refs 可以用于獲取一個 DOM 節點或者 React 組件的引用。何時使用 refs 的好的示例有管理焦點/文本選擇,觸發命令動畫,或者和第三方 DOM 庫集成。你應該避免使用 String 類型的 Refs 和內聯的 ref 回調。Refs 回調是 React 所推薦的。

何為高階組件(higher order component)

高階組件是一個以組件為參數并返回一個新組件的函數。HOC 運行你重用代碼、邏輯和引導抽象。最常見的可能是 Redux 的 connect 函數。除了簡單分享工具庫和簡單的組合,HOC最好的方式是共享 React 組件之間的行為。如果你發現你在不同的地方寫了大量代碼來做同一件事時,就應該考慮將代碼重構為可重用的 HOC。

練習


  • 寫一個反轉其輸入的 HOC
  • 寫一個從 API 提供數據給傳入的組件的 HOC
  • 寫一個實現 shouldComponentUpdate 來避免 reconciliation 的 HOC
  • 寫一個通過 React.Children.toArray 對傳入組件的子組件進行排序的 HOC

使用箭頭函數(arrow functions)的優點是什么

  • 作用域安全:在箭頭函數之前,每一個新創建的函數都有定義自身的 this 值(在構造函數中是新對象;在嚴格模式下,函數調用中的 this 是未定義的;如果函數被稱為“對象方法”,則為基礎對象等),但箭頭函數不會,它會使用封閉執行上下文的 this 值。
  • 簡單:箭頭函數易于閱讀和書寫
  • 清晰:當一切都是一個箭頭函數,任何常規函數都可以立即用于定義作用域。開發者總是可以查找 next-higher 函數語句,以查看 this 的值

為什么建議傳遞給 setState 的參數是一個 callback 而不是一個對象

因為 this.propsthis.state 的更新可能是異步的,不能依賴它們的值去計算下一個 state。

除了在構造函數中綁定 this,還有其它方式嗎

你可以使用屬性初始值設定項(property initializers)來正確綁定回調,create-react-app 也是默認支持的。在回調中你可以使用箭頭函數,但問題是每次組件渲染時都會創建一個新的回調。

怎么阻止組件的渲染

在組件的 render 方法中返回 null 并不會影響觸發組件的生命周期方法

當渲染一個列表時,何為 key?設置 key 的目的是什么

Keys 會有助于 React 識別哪些 items 改變了,被添加了或者被移除了。Keys 應該被賦予數組內的元素以賦予(DOM)元素一個穩定的標識,選擇一個 key 的最佳方法是使用一個字符串,該字符串能惟一地標識一個列表項。很多時候你會使用數據中的 IDs 作為 keys,當你沒有穩定的 IDs 用于被渲染的 items 時,可以使用項目索引作為渲染項的 key,但這種方式并不推薦,如果 items 可以重新排序,就會導致 re-render 變慢。

(在構造函數中)調用 super(props) 的目的是什么

super() 被調用之前,子類是不能使用 this 的,在 ES2015 中,子類必須在 constructor 中調用 super()。傳遞 propssuper() 的原因則是便于(在子類中)能在 constructor 訪問 this.props。

何為 JSX

JSX 是 JavaScript 語法的一種語法擴展,并擁有 JavaScript 的全部功能。JSX 生產 React "元素",你可以將任何的 JavaScript 表達式封裝在花括號里,然后將其嵌入到 JSX 中。在編譯完成之后,JSX 表達式就變成了常規的 JavaScript 對象,這意味著你可以在 if 語句和 for 循環內部使用 JSX,將它賦值給變量,接受它作為參數,并從函數中返回它。

怎么用 React.createElement 重寫下面的代碼

Question:

const element = (
  <h1 className="greeting">
    Hello, rdhub.cn!
  </h1>
);

Answer:

const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, rdhub.cn!'
);

何為 Children

在JSX表達式中,一個開始標簽(比如<a>)和一個關閉標簽(比如</a>)之間的內容會作為一個特殊的屬性props.children被自動傳遞給包含著它的組件。

這個屬性有許多可用的方法,包括 React.Children.map,React.Children.forEach, React.Children.count, React.Children.only,React.Children.toArray。

在 React 中,何為 state

State 和 props 類似,但它是私有的,并且完全由組件自身控制。State 本質上是一個持有數據,并決定組件如何渲染的對象。

什么原因會促使你脫離 create-react-app 的依賴

當你想去配置 webpack 或 babel presets。

何為 redux

Redux 的基本思想是整個應用的 state 保持在一個單一的 store 中。store 就是一個簡單的 javascript 對象,而改變應用 state 的唯一方式是在應用中觸發 actions,然后為這些 actions 編寫 reducers 來修改 state。整個 state 轉化是在 reducers 中完成,并且不應該有任何副作用。

在 Redux 中,何為 store

Store 是一個 javascript 對象,它保存了整個應用的 state。與此同時,Store 也承擔以下職責:

  • 允許通過 getState() 訪問 state
  • 運行通過 dispatch(action) 改變 state
  • 通過 subscribe(listener) 注冊 listeners
  • 通過 subscribe(listener) 返回的函數處理 listeners 的注銷

何為 action

Actions 是一個純 javascript 對象,它們必須有一個 type 屬性表明正在執行的 action 的類型。實質上,action 是將數據從應用程序發送到 store 的有效載荷。

何為 reducer

一個 reducer 是一個純函數,該函數以先前的 state 和一個 action 作為參數,并返回下一個 state。

Redux Thunk 的作用是什么

Redux thunk 是一個允許你編寫返回一個函數而不是一個 action 的 actions creators 的中間件。如果滿足某個條件,thunk 則可以用來延遲 action 的派發(dispatch),這可以處理異步 action 的派發(dispatch)。

何為純函數(pure function)

一個純函數是一個不依賴于且不改變其作用域之外的變量狀態的函數,這也意味著一個純函數對于同樣的參數總是返回同樣的結果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 深入JSX date:20170412筆記原文其實JSX是React.createElement(componen...
    gaoer1938閱讀 8,099評論 2 35
  • 作為一個合格的開發者,不要只滿足于編寫了可以運行的代碼。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個周閱讀 8,482評論 1 33
  • 本筆記基于React官方文檔,當前React版本號為15.4.0。 1. 安裝 1.1 嘗試 開始之前可以先去co...
    Awey閱讀 7,778評論 14 128
  • React.js 小書學習 之 【使用 JSX 描述 UI 信息】 從 JSX 到頁面 過程圖解:JSX 到頁面過...
    zdlucky閱讀 1,292評論 0 20
  • 就像到了成都必泡茶館麻將館,到了北京必逛胡同一樣,拉薩的光明港瓊甜茶館匯集著各種身份的人,是西藏最市井的地方,很多...
    荒凡閱讀 265評論 2 7