35 道咱們必須要清楚的 React 面試題

問題1:什麼是虛擬DOM?

主題: React 難度: ⭐

虛擬 DOM (VDOM)是真實 DOM 在內存中的表示。UI 的表示形式保存在內存中,並與實際的 DOM 同步。這是一個發生在渲染函數被調用和元素在屏幕上顯示之間的步驟,整個過程被稱為調和

問題2:類組件和函數組件之間的區別是啥?

主題: React 難度: ⭐⭐

  • 類組件可以使用其他特性,如狀態 state 和生命週期鉤子。
  • 當組件只是接收 props 渲染到頁面時,就是無狀態組件,就屬於函數組件,也被稱為啞組件或展示組件。

函數組件和類組件當然是有區別的,而且函數組件的性能比類組件的性能要高,因為類組件使用的時候要實例化,而函數組件直接執行函數取返回結果即可。為了提高性能,儘量使用函數組件。

區別函數組件類組件是否有 this沒有有是否有生命週期沒有有是否有狀態 state沒有有

問題 3:React 中 refs 幹嘛用的?

主題: React 難度: ⭐⭐

Refs 提供了一種訪問在render方法中創建的 DOM 節點或者 React 元素的方法。在典型的數據流中,props 是父子組件交互的唯一方式,想要修改子組件,需要使用新的pros重新渲染它。凡事有例外,某些情況下咱們需要在典型數據流外,強制修改子代,這個時候可以使用 Refs。

咱們可以在組件添加一個 ref 屬性來使用,該屬性的值是一個回調函數,接收作為其第一個參數的底層 DOM 元素或組件的掛載實例。

35 道咱們必須要清楚的 React 面試題

請注意,input 元素有一個ref屬性,它的值是一個函數。該函數接收輸入的實際 DOM 元素,然後將其放在實例上,這樣就可以在 handleSubmit 函數內部訪問它。

經常被誤解的只有在類組件中才能使用 refs,但是refs也可以通過利用 JS 中的閉包與函數組件一起使用。

35 道咱們必須要清楚的 React 面試題

問題 4:在 React 中如何處理事件

主題: React 難度: ⭐⭐

為了解決跨瀏覽器的兼容性問題,SyntheticEvent 實例將被傳遞給你的事件處理函數,SyntheticEvent是 React 跨瀏覽器的瀏覽器原生事件包裝器,它還擁有和瀏覽器原生事件相同的接口,包括 stopPropagation() 和 preventDefault()。

比較有趣的是,React 實際上並不將事件附加到子節點本身。React 使用單個事件偵聽器偵聽頂層的所有事件。這對性能有好處,也意味著 React 在更新 DOM 時不需要跟蹤事件監聽器。

問題 5:state 和 props 區別是啥?

主題: React 難度: ⭐⭐

props和state是普通的 JS 對象。雖然它們都包含影響渲染輸出的信息,但是它們在組件方面的功能是不同的。即

  • state 是組件自己管理數據,控制自己的狀態,可變;
  • props 是外部傳入的數據參數,不可變;
  • 沒有state的叫做無狀態組件,有state的叫做有狀態組件;
  • 多用 props,少用 state,也就是多寫無狀態組件。

問題 6:如何創建 refs

主題: React 難度: ⭐⭐

Refs 是使用 React.createRef() 創建的,並通過 ref 屬性附加到 React 元素。在構造組件時,通常將 Refs 分配給實例屬性,以便可以在整個組件中引用它們。

35 道咱們必須要清楚的 React 面試題

或者這樣用:

35 道咱們必須要清楚的 React 面試題

問題 7:什麼是高階組件?

主題: React 難度: ⭐⭐

高階組件(HOC)是接受一個組件並返回一個新組件的函數。基本上,這是一個模式,是從 React 的組合特性中衍生出來的,稱其為純組件,因為它們可以接受任何動態提供的子組件,但不會修改或複製輸入組件中的任何行為。

const EnhancedComponent = higherOrderComponent(WrappedComponent);

HOC 可以用於以下許多用例

  • 代碼重用、邏輯和引導抽象
  • 渲染劫持
  • state 抽象和操作
  • props 處理

問題 8:在構造函數調用 `super` 並將 `props` 作為參數傳入的作用是啥?

主題: React 難度: ⭐⭐

在調用 super() 方法之前,子類構造函數無法使用this引用,ES6 子類也是如此。將 props 參數傳遞給 super() 調用的主要原因是在子構造函數中能夠通過this.props來獲取傳入的 props。

傳遞 props

35 道咱們必須要清楚的 React 面試題

沒傳遞 props

35 道咱們必須要清楚的 React 面試題

上面示例揭示了一點。props 的行為只有在構造函數中是不同的,在構造函數之外也是一樣的。

問題 9:什麼是控制組件?

主題: React 難度: ⭐⭐⭐

在 HTML 中,表單元素如 、<textarea>和<select>通常維護自己的狀態,並根據用戶輸入進行更新。當用戶提交表單時,來自上述元素的值將隨表單一起發送。/<select>/<textarea>

而 React 的工作方式則不同。包含表單的組件將跟蹤其狀態中的輸入值,並在每次回調函數(例如onChange)觸發時重新渲染組件,因為狀態被更新。以這種方式由 React 控制其值的輸入表單元素稱為受控組件

問題 10:如何 React.createElement ?

主題: React 難度: ⭐⭐⭐

問題:

上述代碼如何使用 React.createElement 來實現:

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

問題 11:講講什麼是 JSX ?

主題: React 難度: ⭐⭐⭐

Facebook 第一次發佈 React 時,他們還引入了一種新的 JS 方言 JSX,將原始 HTML 模板嵌入到 JS 代碼中。JSX 代碼本身不能被瀏覽器讀取,必須使用Babel和webpack等工具將其轉換為傳統的JS。很多開發人員就能無意識使用 JSX,因為它已經與 React 結合在一直了。

35 道咱們必須要清楚的 React 面試題

問題 12:根據下面定義的代碼,可以找出存在的兩個問題嗎 ?

主題: React 難度: ⭐⭐⭐

請看下面的代碼:

35 道咱們必須要清楚的 React 面試題

答案:

1.在構造函數沒有將 props 傳遞給 super,它應該包括以下行

constructor(props) {
super(props);
// ...
}

2.事件監聽器(通過addEventListener()分配時)的作用域不正確,因為 ES6 不提供自動綁定。因此,開發人員可以在構造函數中重新分配clickHandler來包含正確的綁定:

constructor(props) {
super(props);
this.clickHandler = this.clickHandler.bind(this);
// ...
}

問題 13:為什麼不直接更新 `state` 呢 ?

主題: React 難度: ⭐⭐⭐

如果試圖直接更新 state ,則不會重新渲染組件。

 // 錯誤
This.state.message = 'Hello world';

需要使用setState()方法來更新 state。它調度對組件state對象的更新。當state改變時,組件通過重新渲染來響應:

// 正確做法
This.setState({message: ‘Hello World’});

問題 14:React 組件生命週期有哪些不同階段?

主題: React 難度: ⭐⭐⭐

在組件生命週期中有四個不同的階段:

  1. Initialization:在這個階段,組件準備設置初始化狀態和默認屬性。
  2. Mounting:react 組件已經準備好掛載到瀏覽器 DOM 中。這個階段包括componentWillMount和componentDidMount生命週期方法。
  3. Updating:在這個階段,組件以兩種方式更新,發送新的 props 和 state 狀態。此階段包括shouldComponentUpdate、componentWillUpdate和componentDidUpdate生命週期方法。
  4. Unmounting:在這個階段,組件已經不再被需要了,它從瀏覽器 DOM 中卸載下來。這個階段包含 componentWillUnmount 生命週期方法。

除以上四個常用生命週期外,還有一個錯誤處理的階段:

Error Handling:在這個階段,不論在渲染的過程中,還是在生命週期方法中或是在任何子組件的構造函數中發生錯誤,該組件都會被調用。這個階段包含了 componentDidCatch 生命週期方法。

35 道咱們必須要清楚的 React 面試題

問題 15:React 的生命週期方法有哪些?

主題: React 難度: ⭐⭐⭐

  • componentWillMount:在渲染之前執行,用於根組件中的 App 級配置。
  • componentDidMount:在第一次渲染之後執行,可以在這裡做AJAX請求,DOM 的操作或狀態更新以及設置事件監聽器。
  • componentWillReceiveProps:在初始化render的時候不會執行,它會在組件接受到新的狀態(Props)時被觸發,一般用於父組件狀態更新時子組件的重新渲染
  • shouldComponentUpdate:確定是否更新組件。默認情況下,它返回true。如果確定在 state 或 props 更新後組件不需要在重新渲染,則可以返回false,這是一個提高性能的方法。
  • componentWillUpdate:在shouldComponentUpdate返回 true 確定要更新組件之前件之前執行。
  • componentDidUpdate:它主要用於更新DOM以響應props或state更改。
  • componentWillUnmount:它用於取消任何的網絡請求,或刪除與組件關聯的所有事件監聽器。

問題 16:這三個點(…)在 React 幹嘛用的?

主題: React 難度: ⭐⭐⭐

... 在React(使用JSX)代碼中做什麼?它叫什麼?

這個叫擴展操作符號或者展開操作符,例如,如果this.props包含a:1和b:2,則

等價於下面內容:

擴展符號不僅適用於該用例,而且對於創建具有現有對象的大多數(或全部)屬性的新對象非常方便,在更新state 咱們就經常這麼做:

this.setState(prevState => {
return {foo: {...prevState.foo, a: "updated"}};
})

問題 17:使用 React Hooks 好處是啥?

主題: React 難度: ⭐⭐⭐

首先,Hooks 通常支持提取和重用跨多個組件通用的有狀態邏輯,而無需承擔高階組件或渲染 props 的負擔。Hooks 可以輕鬆地操作函數組件的狀態,而不需要將它們轉換為類組件。

Hooks 在類中不起作用,通過使用它們,咱們可以完全避免使用生命週期方法,例如 componentDidMount、componentDidUpdate、componentWillUnmount。相反,使用像useEffect這樣的內置鉤子。

問題 18:什麼是 React Hooks?

主題: React 難度: ⭐⭐⭐

Hooks是 React 16.8 中的新添加內容。它們允許在不編寫類的情況下使用state和其他 React 特性。使用 Hooks,可以從組件中提取有狀態邏輯,這樣就可以獨立地測試和重用它。Hooks 允許咱們在不改變組件層次結構的情況下重用有狀態邏輯,這樣在許多組件之間或與社區共享 Hooks 變得很容易。

問題 19:React 中的 `useState()` 是什麼?

主題: React 難度: ⭐⭐⭐

下面說明useState(0)的用途:

35 道咱們必須要清楚的 React 面試題

useState 是一個內置的 React Hook。useState(0) 返回一個元組,其中第一個參數count是計數器的當前狀態,setCounter 提供更新計數器狀態的方法。

咱們可以在任何地方使用setCounter方法更新計數狀態-在這種情況下,咱們在setCount函數內部使用它可以做更多的事情,使用 Hooks,能夠使咱們的代碼保持更多功能,還可以避免過多使用基於類的組件。

問題 20:React 中的StrictMode(嚴格模式)是什麼?

主題: React 難度: ⭐⭐⭐

React 的StrictMode是一種輔助組件,可以幫助咱們編寫更好的 react 組件,可以使用<strictmode>包裝一組組件,並且可以幫咱們以下檢查:

  • 驗證內部組件是否遵循某些推薦做法,如果沒有,會在控制檯給出警告。
  • 驗證是否使用的已經廢棄的方法,如果有,會在控制檯給出警告。
  • 通過識別潛在的風險預防一些副作用。

問題 21:為什麼類方法需要綁定到類實例?

主題: React 難度: ⭐⭐⭐

在 JS 中,this 值會根據當前上下文變化。在 React 類組件方法中,開發人員通常希望 this 引用組件的當前實例,因此有必要將這些方法綁定到實例。通常這是在構造函數中完成的:

35 道咱們必須要清楚的 React 面試題

問題 22:什麼是 prop drilling,如何避免?

主題: React 難度: ⭐⭐⭐

在構建 React 應用程序時,在多層嵌套組件來使用另一個嵌套組件提供的數據。最簡單的方法是將一個 prop 從每個組件一層層的傳遞下去,從源組件傳遞到深層嵌套組件,這叫做prop drilling

prop drilling的主要缺點是原本不需要數據的組件變得不必要地複雜,並且難以維護。

為了避免prop drilling,一種常用的方法是使用React Context。通過定義提供數據的Provider組件,並允許嵌套的組件通過Consumer組件或useContext Hook 使用上下文數據。

問題 23:描述 Flux 與 MVC?

主題: React 難度: ⭐⭐⭐

傳統的 MVC 模式在分離數據(Model)、UI(View和邏輯(Controller)方面工作得很好,但是 MVC 架構經常遇到兩個主要問題:

數據流不夠清晰

:跨視圖發生的級聯更新常常會導致混亂的事件網絡,難於調試。

缺乏數據完整性:模型數據可以在任何地方發生突變,從而在整個UI中產生不可預測的結果。

使用 Flux 模式的複雜用戶界面不再遭受級聯更新,任何給定的React 組件都能夠根據 store 提供的數據重建其狀態。Flux 模式還通過限制對共享數據的直接訪問來加強數據完整性。

問題 24:受控組件和非受控組件區別是啥?

主題: React 難度: ⭐⭐⭐

  • 受控組件是 React 控制中的組件,並且是表單數據真實的唯一來源。
  • 非受控組件是由 DOM 處理表單數據的地方,而不是在 React 組件中。

儘管非受控組件通常更易於實現,因為只需使用refs即可從 DOM 中獲取值,但通常建議優先選擇受控制的組件,而不是非受控制的組件。

這樣做的主要原因是受控組件支持即時字段驗證,允許有條件地禁用/啟用按鈕,強制輸入格式。

問題 25:這段代碼有什麼問題嗎?

主題: React 難度: ⭐⭐⭐⭐

這段代碼有什麼問題:

this.setState((prevState, props) => {
return {
streak: prevState.streak + props.count
}
})

答案:

沒有什麼問題。這種方式很少被使用,咱們可以將一個函數傳遞給setState,該函數接收上一個 state 的值和當前的props,並返回一個新的狀態,如果咱們需要根據以前的狀態重新設置狀態,推薦使用這種方式。

問題 26:什麼是 React Context?

主題: React 難度: ⭐⭐⭐⭐

Context 通過組件樹提供了一個傳遞數據的方法,從而避免了在每一個層級手動的傳遞 props 屬性。

問題 27:什麼是 React Fiber?

主題: React 難度: ⭐⭐⭐⭐

Fiber 是 React 16 中新的協調引擎或重新實現核心算法。它的主要目標是支持虛擬DOM的增量渲染。React Fiber 的目標是提高其在動畫、佈局、手勢、暫停、中止或重用等方面的適用性,併為不同類型的更新分配優先級,以及新的併發原語。

React Fiber 的目標是增強其在動畫、佈局和手勢等領域的適用性。它的主要特性是增量渲染:能夠將渲染工作分割成塊,並將其分散到多個幀中。

問題 28:如何在 ReactJS 的 Props上應用驗證?

主題: React 難度: ⭐⭐⭐⭐

當應用程序在開發模式下運行時,React 將自動檢查咱們在組件上設置的所有 props,以確保它們具有正確的數據類型。對於不正確的類型,開發模式下會在控制檯中生成警告消息,而在生產模式中由於性能影響而禁用它。強制的 props 用 isRequired定義的。

下面是一組預定義的 prop 類型:

  • React.PropTypes.string
  • React.PropTypes.number
  • React.PropTypes.func
  • React.PropTypes.node
  • React.PropTypes.bool

例如,咱們為用戶組件定義瞭如下的propTypes

35 道咱們必須要清楚的 React 面試題

問題 29:在 React 中使用構造函數和 getInitialState 有什麼區別?

主題: React 難度: ⭐⭐⭐⭐

構造函數和getInitialState之間的區別就是ES6和ES5本身的區別。在使用ES6類時,應該在構造函數中初始化state,並在使用React.createClass時定義getInitialState方法。

class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { /* initial state */ };
}
}

等價於:

var MyComponent = React.createClass({
getInitialState() {
return { /* initial state */ };
},
})

問題 30:如何有條件地向 React 組件添加屬性?

主題: React 難度: ⭐⭐⭐⭐

對於某些屬性,React 非常聰明,如果傳遞給它的值是虛值,可以省略該屬性。例如:

35 道咱們必須要清楚的 React 面試題

渲染結果:

另一種可能的方法是:

var condition = true;var component = ( 
)

問題 31:Hooks會取代 `render props` 和高階組件嗎?

主題: React 難度: ⭐⭐⭐⭐

通常,render props和高階組件僅渲染一個子組件。React團隊認為,Hooks 是服務此用例的更簡單方法。

這兩種模式仍然有一席之地(例如,一個虛擬的 scroller 組件可能有一個 renderItem prop,或者一個可視化的容器組件可能有它自己的 DOM 結構)。但在大多數情況下,Hooks 就足夠了,可以幫助減少樹中的嵌套。

問題 32:如何避免組件的重新渲染?

主題: React 難度: ⭐⭐⭐⭐

React 中最常見的問題之一是組件不必要地重新渲染。React 提供了兩個方法,在這些情況下非常有用:

  • React.memo():這可以防止不必要地重新渲染函數組件
  • PureComponent:這可以防止不必要地重新渲染類組件

這兩種方法都依賴於對傳遞給組件的props的淺比較,如果 props 沒有改變,那麼組件將不會重新渲染。雖然這兩種工具都非常有用,但是淺比較會帶來額外的性能損失,因此如果使用不當,這兩種方法都會對性能產生負面影響。

通過使用 React Profiler,可以在使用這些方法前後對性能進行測量,從而確保通過進行給定的更改來實際改進性能。

問題 33:什麼是純函數?

主題: React 難度: ⭐⭐⭐⭐⭐

純函數是不依賴並且不會在其作用域之外修改變量狀態的函數。本質上,純函數始終在給定相同參數的情況下返回相同結果。

問題 34:當調用`setState`時,React `render` 是如何工作的?

主題: React 難度: ⭐⭐⭐⭐⭐

咱們可以將"render"分為兩個步驟:

  1. 虛擬 DOM 渲染:當render方法被調用時,它返回一個新的組件的虛擬 DOM 結構。當調用setState()時,render會被再次調用,因為默認情況下shouldComponentUpdate總是返回true,所以默認情況下 React 是沒有優化的。
  2. 原生 DOM 渲染:React 只會在虛擬DOM中修改真實DOM節點,而且修改的次數非常少——這是很棒的React特性,它優化了真實DOM的變化,使React變得更快。

問題 35:如何避免在React重新綁定實例?

主題: React 難度: ⭐⭐⭐⭐⭐

有幾種常用方法可以避免在 React 中綁定方法:

  1. 將事件處理程序定義為內聯箭頭函數
35 道咱們必須要清楚的 React 面試題

2.使用箭頭函數來定義方法:

35 道咱們必須要清楚的 React 面試題

3.使用帶有 Hooks 的函數組件

35 道咱們必須要清楚的 React 面試題


分享到:


相關文章: