常見的React面試題

一、redux中間件javascript

答:中間件提供第三方插件的模式,自定義攔截 action -> reducer 的過程。變爲 action -> middlewares -> reducer 。這種機制可讓咱們改變數據流,實現如異步 action ,action 過濾,日誌輸出,異常報告等功能。前端

常見的中間件: redux-logger:提供日誌輸出;redux-thunk:處理異步操做;redux-promise:處理異步操做;actionCreator的返回值是promisejava

二、redux有什麼缺點react

答:1.一個組件所須要的數據,必須由父組件傳過來,而不能像flux中直接從store取。webpack

2.當一個組件相關數據更新時,即便父組件不須要用到這個組件,父組件仍是會從新render,可能會有效率影響,或者須要寫複雜的shouldComponentUpdate進行判斷。web

三、react組件的劃分業務組件技術組件?算法

答:根據組件的職責一般把組件分爲UI組件和容器組件。UI 組件負責 UI 的呈現,容器組件負責管理數據和邏輯。二者經過React-Redux 提供connect方法聯繫起來。redux

四、react生命週期函數數組

答:1、初始化階段:promise

getDefaultProps:獲取實例的默認屬性

getInitialState:獲取每一個實例的初始化狀態

componentWillMount:組件即將被裝載、渲染到頁面上

render:組件在這裏生成虛擬的DOM節點

componentDidMount:組件真正在被裝載以後

2、運行中狀態:

componentWillReceiveProps:組件將要接收到屬性的時候調用

shouldComponentUpdate:組件接受到新屬性或者新狀態的時候(能夠返回false,接收數據後不更新,阻止render調用,後面的函數不會被繼續執行了)

componentWillUpdate:組件即將更新不能修改屬性和狀態

render:組件從新描繪

componentDidUpdate:組件已經更新

3、銷燬階段:

componentWillUnmount:組件即將銷燬

五、react性能優化是哪一個周期函數?

答:shouldComponentUpdate 這個方法用來判斷是否須要調用render方法從新描繪dom。由於dom的描繪很是消耗性能,若是咱們能在shouldComponentUpdate方法中可以寫出更優化的dom diff算法,能夠極大的提升性能。

六、爲何虛擬dom會提升性能?

答:虛擬dom至關於在js和真實dom中間加了一個緩存,利用dom diff算法避免了沒有必要的dom操做,從而提升性能。

具體實現步驟以下:

1.用 JavaScript 對象結構表示 DOM 樹的結構;而後用這個樹構建一個真正的 DOM 樹,插到文檔當中;

2.當狀態變動的時候,從新構造一棵新的對象樹。而後用新的樹和舊的樹進行比較,記錄兩棵樹差別;

把2所記錄的差別應用到步驟1所構建的真正的DOM樹上,視圖就更新了。

七、diff算法?

答:1.把樹形結構按照層級分解,只比較同級元素。

2.給列表結構的每一個單元添加惟一的key屬性,方便比較。

3.React 只會匹配相同 class 的 component(這裏面的class指的是組件的名字)

4.合併操做,調用 component 的 setState 方法的時候, React 將其標記爲 dirty.到每個事件循環結束, React 檢5.查全部標記 dirty 的 component 從新繪製.

6.選擇性子樹渲染。開發人員能夠重寫shouldComponentUpdate提升diff的性能。

八、react性能優化方案

答:1)重寫shouldComponentUpdate來避免沒必要要的dom操做。

2)使用 production 版本的react.js。

3)使用key來幫助React識別列表中全部子組件的最小變化

九、簡述flux 思想

答:Flux 的最大特色,就是數據的"單向流動"。

1.用戶訪問 View

2.View 發出用戶的 Action

3.Dispatcher 收到 Action,要求 Store 進行相應的更新

4.Store 更新後,發出一個"change"事件

5.View 收到"change"事件後,更新頁面

十、React項目用過什麼腳手架?Mern? Yeoman?

答:Mern:MERN是腳手架的工具,它能夠很容易地使用Mongo, Express, React and NodeJS生成同構JS應用。它最大限度地減小安裝時間,並獲得您使用的成熟技術來加速開發。

十一、你瞭解React嗎?

答:瞭解,React是facebook搞出來的一個輕量級的組件庫,用於解決前端視圖層的一些問題,就是MVC中V層的問題,它內部的Instagram網站就是用React搭建的。

十二、React解決了什麼問題?

答:解決了三個問題: 1.組件複用問題, 2.性能問題,3.兼容性問題:

1三、React的協議?

答:React遵循的協議是「BSD許可證 + 專利開源協議」,這個協議比較奇葩,若是你的產品跟facebook沒有競爭關係,你能夠自由的使用react,可是若是有競爭關係,你的react的使用許可將會被取消

1四、瞭解shouldComponentUpdate嗎?

答:React虛擬dom技術要求不斷的將dom和虛擬dom進行diff比較,若是dom樹比價大,這種比較操做會比較耗時,所以React提供了shouldComponentUpdate這種補丁函數,若是對於一些變化,若是咱們不但願某個組件刷新,或者刷新後跟原來其實同樣,就可使用這個函數直接告訴React,省去diff操做,進一步的提升了效率。

1五、React 的工做原理?

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

1六、使用 React 有何優勢?

答:1.只需查看 render 函數就會很容易知道一個組件是如何被渲染的

2.JSX 的引入,使得組件的代碼更加可讀,也更容易看懂組件的佈局,或者組件之間是如何互相引用的

3.支持服務端渲染,這能夠改進 SEO 和性能

4.易於測試

5.React 只關注 View 層,因此能夠和其它任何框架(如Backbone.js, Angular.js)一塊兒使用

1七、展現組件(Presentational component)和容器組件(Container component)之間有何不一樣?

答:1.展現組件關心組件看起來是什麼。展現專門經過 props 接受數據和回調,而且幾乎不會有自身的狀態,但當展現組件擁有自身的狀態時,一般也只關心 UI 狀態而不是數據的狀態。

2.容器組件則更關心組件是如何運做的。容器組件會爲展現組件或者其它容器組件提供數據和行爲(behavior),它們會調用 Flux actions,並將其做爲回調提供給展現組件。容器組件常常是有狀態的,由於它們是(其它組件的)數據源

1八、類組件(Class component)和函數式組件(Functional component)之間有何不一樣?

答:1.類組件不只容許你使用更多額外的功能,如組件自身的狀態和生命週期鉤子,也能使組件直接訪問 store 並維持狀態

2.當組件僅是接收 props,並將組件自身渲染到頁面時,該組件就是一個 '無狀態組件(stateless component)',可使用一個純函數來建立這樣的組件。這種組件也被稱爲啞組件(dumb components)或展現組件

1九、(組件的)狀態(state)和屬性(props)之間有何不一樣?

答:1. State 是一種數據結構,用於組件掛載時所需數據的默認值。State 可能會隨着時間的推移而發生突變,但多數時候是做爲用戶事件行爲的結果。

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

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

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

2一、何爲受控組件(controlled component)?

答;在 HTML 中,相似 <input>, <textarea> 和 <select> 這樣的表單元素會維護自身的狀態,並基於用戶的輸入來更新。當用戶提交表單時,前面提到的元素的值將隨表單一塊兒被髮送。但在 React 中會有些不一樣,包含表單元素的組件將會在 state 中追蹤輸入的值,而且每次調用回調函數時,如 onChange 會更新 state,從新渲染組件。一個輸入表單元素,它的值經過 React 的這種方式來控制,這樣的元素就被稱爲"受控元素"。

2二、在 React 中,refs 的做用是什麼?

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

2三、何爲高階組件(higher order component)?

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

24. 使用箭頭函數(arrow functions)的優勢是什麼?

答:1. 做用域安全:在箭頭函數以前,每個新建立的函數都有定義自身的 this 值(在構造函數中是新對象;在嚴格模式下,函數調用中的 this 是未定義的;若是函數被稱爲「對象方法」,則爲基礎對象等),但箭頭函數不會,它會使用封閉執行上下文的 this 值。

2. 簡單:箭頭函數易於閱讀和書寫

3. 清晰:當一切都是一個箭頭函數,任何常規函數均可以當即用於定義做用域。開發者老是能夠查找 next-higher 函數語句,以查看 this 的值

2五、爲何建議傳遞給 setState 的參數是一個 callback 而不是一個對象?

答:由於 this.props 和 this.state 的更新多是異步的,不能依賴它們的值去計算下一個 state。

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

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

2七、怎麼阻止組件的渲染?

答:在組件的 render 方法中返回 null 並不會影響觸發組件的生命週期方法

2八、當渲染一個列表時,何爲 key?設置 key 的目的是什麼?

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

2九、(在構造函數中)調用 super(props) 的目的是什麼?

答:在 super() 被調用以前,子類是不能使用 this 的,在 ES2015 中,子類必須在 constructor 中調用 super()。傳遞 props 給 super() 的緣由則是便於(在子類中)能在 constructor 訪問 this.props。

30、何爲 JSX ?

答:JSX 是 JavaScript 語法的一種語法擴展,並擁有 JavaScript 的所有功能。JSX 生產 React "元素",你能夠將任何的 JavaScript 表達式封裝在花括號裏,而後將其嵌入到 JSX 中。在編譯完成以後,JSX 表達式就變成了常規的 JavaScript 對象,這意味着你能夠在 if 語句和 for 循環內部使用 JSX,將它賦值給變量,接受它做爲參數,並從函數中返回它。

31何爲 Children ?

答:在JSX表達式中,一個開始標籤(好比<a>)和一個關閉標籤(好比</a>)之間的內容會做爲一個特殊的屬性props.children被自動傳遞給包含着它的組件。

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

3二、在 React 中,何爲 state?

答:State 和 props 相似,但它是私有的,而且徹底由組件自身控制。State 本質上是一個持有數據,並決定組件如何渲染的對象。

3三、什麼緣由會促使你脫離 create-react-app 的依賴?

答;當你想去配置 webpack 或 babel presets。

3四、何爲 redux ?

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

3五、在 Redux 中,何爲 store ?

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

  1. 容許經過 getState() 訪問 state
  2. 運行經過 dispatch(action) 改變 state
  3. 經過 subscribe(listener) 註冊 listeners
  4. 經過 subscribe(listener) 返回的函數處理 listeners 的注

3六、何爲 action ?

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

3七、何爲 reducer ?

答:一個 reducer 是一個純函數,該函數以先前的 state 和一個 action 做爲參數,並返回下一個 state。

3八、Redux Thunk 的做用是什麼?

答:Redux thunk 是一個容許你編寫返回一個函數而不是一個 action 的 actions creators 的中間件。若是知足某個條件,thunk 則能夠用來延遲 action 的派發(dispatch),這能夠處理異步 action 的派發(dispatch)。

3九、何爲純函數(pure function)?

答:一個純函數是一個不依賴於且不改變其做用域以外的變量狀態的函數,這也意味着一個純函數對於一樣的參數老是返回一樣的結果。

相關文章
相關標籤/搜索