2025.04.19react面試題

以下是整理的 20 道 React 面試題,涵蓋基礎、進階和實戰應用,適用于社招或內推準備:


一、React 基礎(適合初中級)

  1. React 中的組件有哪幾種?它們有什么區別?

  2. 什么是 JSX?它與 HTML 有什么不同?

  3. React 是如何實現虛擬 DOM 的?它的優勢是什么?

  4. 組件的生命周期函數有哪些?React 18 中的變化是?

  5. React 中 key 的作用是什么?為什么不能用 index 作為 key?

  6. 如何在函數組件中模擬 componentDidMount?

  7. 受控組件和非受控組件的區別?分別適用于什么場景?

  8. React 中事件綁定有哪些方式?有什么坑需要注意?

  9. 如何實現組件之間的通信?

  10. React 如何實現條件渲染和列表渲染?


二、Hooks 專題(React 16.8+)

  1. useEffect 有哪些使用場景?依賴數組寫錯會帶來什么問題?

  2. useRef 和 useState 的區別?分別適用于哪些場景?

  3. React 中如何避免 useEffect 死循環?

  4. 如何實現一個自定義 Hook?能舉個例子嗎?

  5. 為什么不能在循環、條件或嵌套函數中調用 Hook?


三、性能優化與實戰技巧

  1. React 中如何避免不必要的重新渲染?有哪些優化手段?

  2. React.memo、useMemo 和 useCallback 的作用與區別?

  3. React 中如何實現懶加載?如何配合 Suspense 使用?

  4. 如何在 React 中做錯誤邊界處理?為什么函數組件不能做?

  5. React18 中 Concurrent Mode 是什么?對開發者有什么影響?

好的,下面是前 5 道 React 面試題,以八股文風格整理,方便記憶和背誦:


  1. React 中的組件有哪幾種?它們有什么區別?

答:
React 組件主要分為兩類:類組件(Class Component)與函數組件(Function Component)。
類組件通過 class 關鍵字定義,需繼承 React.Component,具備生命周期函數、this.state 和 this.setState 等特性;
函數組件最初為純展示組件,自 React 16.8 引入 Hook 后也能擁有狀態與副作用邏輯,寫法更簡潔。
當前推薦使用函數組件,因其更易組合復用,性能優化更簡單,官方也逐步棄用類組件。


  1. 什么是 JSX?它與 HTML 有什么不同?

答:
JSX 是 JavaScript 的語法擴展,允許在 JavaScript 中書寫類似 HTML 的代碼,用于描述 UI 結構。
JSX 本質是 React.createElement 的語法糖,最終會被編譯為 JavaScript 對象。
與 HTML 的不同點包括:

所有標簽必須閉合;

屬性使用駝峰命名,如 className、onClick;

表達式需用 {} 包裹;

可以嵌套任意 JS 表達式。


  1. React 是如何實現虛擬 DOM 的?它的優勢是什么?

答:
React 中的虛擬 DOM 是用 JavaScript 對象描述真實 DOM 結構的中間表示。每次狀態變化后,會生成新的虛擬 DOM 樹,并與舊的樹進行 Diff 運算,找出差異部分,再最小化更新真實 DOM。
其優勢包括:

避免直接操作真實 DOM,提高性能;

更好的跨平臺能力;

有利于實現時間切片、異步渲染等高級特性。


  1. 組件的生命周期函數有哪些?React 18 中的變化是?

答:
類組件的生命周期分為三個階段:

掛載階段:constructor → render → componentDidMount;

更新階段:shouldComponentUpdate → render → componentDidUpdate;

卸載階段:componentWillUnmount。
React 16 后廢棄部分不安全生命周期,如 componentWillMount,推薦使用 getDerivedStateFromProps 和 getSnapshotBeforeUpdate 替代。
React 18 推出了自動批處理與并發特性,對生命周期感知更強,建議使用函數組件 + Hook 替代類組件管理生命周期。


  1. React 中 key 的作用是什么?為什么不能用 index?

答:
key 是 React 用于識別列表中元素的唯一標識,在執行 Diff 算法時能更高效定位變動元素。
若使用 index,當列表順序改變時可能導致組件錯誤復用、狀態錯亂、動畫異常等問題。
應優先使用唯一且穩定的業務 id 作為 key,只有在列表靜態、不會增刪改時才可使用 index。


好的,繼續為你整理 第 6~10 題 的 React 八股文風格問答:


  1. 如何在函數組件中模擬 componentDidMount?

答:
函數組件中可使用 useEffect 模擬類組件的 componentDidMount。
寫法如下:

useEffect(() => {
// 初始化邏輯
}, []);

當 useEffect 的依賴數組傳入空數組 [] 時,表示該副作用函數僅在組件首次渲染時執行一次,行為等價于類組件中的 componentDidMount。
該模式常用于請求初始化數據、設置事件監聽、初始化定時器等場景。


  1. 受控組件和非受控組件的區別?分別適用于什么場景?

答:
React 中,表單組件可分為受控組件和非受控組件。

受控組件:其值受 React state 控制,通過 value 和 onChange 實現雙向綁定。
優點是數據可控,易于校驗和聯動;

非受控組件:直接操作 DOM 讀取表單值,通常配合 ref 使用。

適用場景:

受控組件適用于復雜交互和受狀態驅動的場景;

非受控組件適用于性能敏感或簡單場景,如登錄表單、文件上傳等。


  1. React 中事件綁定有哪些方式?有什么坑需要注意?

答:
React 中常見的事件綁定方式包括:

在 JSX 中綁定箭頭函數(推薦):
onClick={() => handleClick(id)}

在組件外定義綁定函數:
onClick={handleClick},注意需在 constructor 中 bind:
this.handleClick = this.handleClick.bind(this);

使用 class fields 語法(推薦):
handleClick = () => { … }

注意事項:

每次 render 重新創建箭頭函數會影響性能;

函數組件中事件默認具有自動綁定能力,不用顯式 bind;

React 事件是合成事件,非原生事件,具備跨瀏覽器兼容性,支持事件池優化(v17 之后逐步廢棄事件池機制)。


好的,以下是 第 11~15 題(Hooks 專題) 的八股文風格標準問答:


  1. useEffect 有哪些使用場景?依賴數組寫錯會帶來什么問題?

答:
useEffect 是 React 中用于處理副作用的 Hook,常見使用場景包括:

組件掛載時請求數據;

監聽事件或訂閱操作;

依賴變化時執行操作;

清理副作用(如定時器、訂閱)。

其語法如下:

useEffect(() => {
// 副作用邏輯
return () => {
// 清理邏輯
};
}, [dependencies]);

若依賴數組寫錯(漏依賴、寫錯變量等),可能導致:

副作用函數未正確觸發或頻繁執行;

狀態不一致、數據不同步;

引發死循環或內存泄漏。

應借助 ESLint 插件(如 eslint-plugin-react-hooks)自動校驗依賴項完整性。


  1. useRef 和 useState 的區別?分別適用于哪些場景?

答:
useRef 和 useState 都可用于在函數組件中存儲數據,但用途與行為不同:

useState:用于聲明響應式狀態,狀態變更會觸發組件重新渲染;

useRef:用于存儲可變值,變更不會觸發組件重新渲染,常用于保存 DOM 引用或跨渲染周期保存變量。

適用場景對比如下:

表單輸入值:useState;

DOM 節點操作:useRef;

記錄上一次狀態值或定時器 ID:useRef;

控制重新渲染邏輯:useRef 可避免因頻繁更新而導致的性能浪費。


  1. React 中如何避免 useEffect 死循環?

答:
useEffect 死循環通常由以下原因導致:

依賴數組中包含每次 render 都變化的值(如函數、對象、數組);

副作用函數中更新了依賴項所關聯的狀態。

解決方式包括:

使用 useCallback 或 useMemo 對函數和對象進行穩定處理;

合理拆分多個 useEffect,細化每個副作用的關注點;

使用空依賴數組 [] 表示只執行一次(等價于 componentDidMount);

嚴格遵循 ESLint 對依賴項的提示,必要時用注釋忽略。


  1. 如何實現一個自定義 Hook?能舉個例子嗎?

答:
自定義 Hook 是以 use 開頭的函數,用于復用邏輯片段,讓組件更簡潔、更易維護。

示例:封裝一個監聽窗口大小的 Hook

import { useState, useEffect } from ‘react’;

function useWindowSize() {
const [size, setSize] = useState({ width: window.innerWidth, height: window.innerHeight });

useEffect(() => {
const handleResize = () => {
setSize({ width: window.innerWidth, height: window.innerHeight });
};
window.addEventListener(‘resize’, handleResize);
return () => window.removeEventListener(‘resize’, handleResize);
}, []);

return size;
}

使用方式:

const { width, height } = useWindowSize();

該 Hook 封裝了監聽邏輯,提升代碼復用性和可讀性。


  1. 為什么不能在循環、條件或嵌套函數中調用 Hook?

答:
React 的 Hook 調用必須遵循 “Hook 規則”,即:

只能在函數組件或自定義 Hook 的頂層調用 Hook;

不能在循環、條件、嵌套函數中調用 Hook。

原因是 React 依賴調用順序識別每個 Hook 的位置。
若在條件或循環中調用 Hook,會導致調用順序不一致,破壞內部 Hook 棧,從而引發運行時錯誤或邏輯異常。

官方提供 ESLint 插件 eslint-plugin-react-hooks,可幫助開發者自動檢測 Hook 使用規范。


好的,下面是 第 16~20 題(性能優化與實戰技巧) 的 React 八股文風格標準問答:


  1. React 如何優化組件性能?有哪些常見手段?

答:
React 性能優化的目標是減少無效渲染、避免重復計算與狀態不一致。常見優化手段包括:

  1. 使用 React.memo:包裝函數組件,避免 props 無變化時重復渲染;

  2. 使用 useMemo:緩存復雜計算結果,僅在依賴變化時重新計算;

  3. 使用 useCallback:緩存函數引用,防止子組件因函數變化而重渲染;

  4. 避免匿名函數和 inline 對象:避免每次 render 創建新引用;

  5. 拆分組件粒度:將大組件拆分為小組件,提升局部更新效率;

  6. 懶加載(React.lazy + Suspense):按需加載組件,減少初始包體積;

  7. 虛擬滾動:使用 react-window、react-virtualized 等庫提升長列表渲染性能;

  8. 開啟生產構建優化:確保使用 production 模式打包,開啟 tree-shaking 和代碼壓縮。


  1. useMemo 和 useCallback 有什么區別?使用場景分別是什么?

答:
useMemo 與 useCallback 都用于性能優化,避免因重新渲染導致的重復計算或函數引用變更。

useMemo(fn, deps):返回 計算結果,常用于緩存變量(如復雜計算、篩選、排序等);

useCallback(fn, deps):返回 函數引用,常用于將函數傳入子組件或用于依賴中防止無限循環。

使用場景:

useMemo:優化計算型表達式;

useCallback:優化函數傳參與事件處理器。
需注意過度使用反而適得其反,建議僅在明顯性能瓶頸場景下使用。


  1. 什么是 Context?使用時有哪些注意事項?

答:
React Context 是用于跨組件層級共享數據的機制,適用于全局狀態傳遞如主題、用戶信息等。核心 API 包括:

const ThemeContext = React.createContext(defaultValue);
<ThemeContext.Provider value={…}>

</ThemeContext.Provider>

在子組件中使用 useContext(ThemeContext) 獲取上下文值。

注意事項:

每次 Provider 的 value 變化都會引發所有消費組件重新渲染;

可配合 useMemo 或分離 Provider 組件優化性能;

不適用于頻繁變化的局部狀態(如輸入框內容、臨時彈窗);


  1. React 中如何處理錯誤?如何實現錯誤邊界?

答:
React 提供錯誤邊界機制處理組件樹中的渲染錯誤(不包括事件、異步邏輯等)。

實現方法:

  1. 創建類組件,定義 componentDidCatch 和 getDerivedStateFromError:

class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, info) {
// 上報錯誤日志
}
render() {
return this.state.hasError ? : this.props.children;
}
}

  1. 使用方式:將其包裹目標組件

注意:錯誤邊界只能捕獲其子組件中的錯誤。


  1. React18 中的新特性有哪些?和之前版本有何不同?

答:
React 18 引入了多項新特性,提升并發渲染與用戶體驗能力:

  1. 自動批處理(Automatic Batching):多個 state 更新自動合并,減少 render 次數;

  2. 并發渲染架構(Concurrent Features):通過 startTransition 實現高優先級交互與低優先級更新并行處理;

  3. Transition API:可區分緊急與非緊急更新,提升響應性能;

const [isPending, startTransition] = useTransition();
startTransition(() => {
setSearchQuery(input);
});

  1. useId:解決 SSR 與客戶端 ID 不一致的問題;

  2. ReactDOM.createRoot:替代 ReactDOM.render,支持并發模式;

  3. Streaming SSR with Suspense:服務器端渲染支持 Suspense 流式輸出。

React 18 標志著進入“并發時代”,推薦逐步遷移核心項目使用新版能力。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80083.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬蟲從入門到實戰詳細版教程Char01:爬蟲基礎與核心技術

1.1 什么是網絡爬蟲? 1.1.1 定義與分類 網絡爬蟲:互聯網世界的“信息捕手” 網絡爬蟲(Web Crawler),又稱網絡蜘蛛或網絡機器人,是一種通過預設規則自動訪問網頁、提取數據的程序系統。從技術視角看,其核心任務是通過模擬瀏覽器行為向目標服務器發起請求,解析網頁內容…

Python爬蟲實戰:獲取xie程網近兩周長沙飛敦煌機票數據,為51出行做參考

一、引言 1.1 研究背景 伴隨互聯網技術的迅猛發展與人們生活水平的顯著提升,在線旅游平臺成為人們出行預訂的重要途徑。其中,飛機作為高效快捷的長途出行方式備受青睞。xie程網作為國內領先的在線旅游平臺,匯聚了豐富的機票信息。對于計劃在 51 出行期間從長沙飛往敦煌的旅…

Mujoco robosuite 機器人模型

import ctypes import os# 獲取當前腳本所在的目錄 script_dir os.path.dirname(os.path.abspath(__file__))# 構建庫文件的相對路徑 lib_relative_path os.path.join(dynamic_models, UR5e, Jb.so)# 拼接成完整的路徑 lib_path os.path.join(script_dir, lib_relative_path…

【重學Android】02.Java環境配置的一些分享

背景說明 其實只是學習Android的話&#xff0c;只要下載好Android Studio開發工具&#xff0c;是自帶JDK環境的&#xff0c;所以不需要再額外去進行配置&#xff0c;我之所以還要進行單獨配置&#xff0c;是因為我其他的工具需要Java的環境&#xff0c;而且我目前用的是JDK 12…

Linux 網絡編程:select、poll 與 epoll 深度解析 —— 從基礎到高并發實戰

一、IO 多路復用&#xff1a;解決并發 IO 的核心技術 在網絡編程中&#xff0c;當需要同時處理大量客戶端連接時&#xff0c;傳統阻塞式 IO 會導致程序卡在單個操作上&#xff0c;造成資源浪費。IO 多路復用技術允許單線程監聽多個文件描述符&#xff08;FD&#xff09;&#…

制作你的時間管理“局”#自制軟件,5款AI編程對比測試

玩 AI 編程最有意思的地方&#xff0c;就是當你有想法的時候&#xff0c;可以隨時測試、把想法具體化&#xff0c;甚至產品化。今天我們制作一個事件管理器&#xff0c;用來量化我們每天的時間安排&#xff0c;提高時間的利用率&#xff0c;提升生產力。 同樣的一組 prompt &am…

大數據系列 | 詳解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完結

大數據系列 | 詳解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署 1. ClickHouse與MySQL的區別2. 在群集的所有機器上安裝ClickHouse服務端2.1. 在線安裝clickhouse2.2. 離線安裝clickhouse 3. ClickHouse Keeper/Zookeeper集群安裝4. 在配置文件中設置集群配置5. 在每…

宏碁筆記本電腦怎樣開啟/關閉觸摸板

使用快捷鍵&#xff1a;大多數宏碁筆記本可以使用 “FnF7” 或 “FnF8” 組合鍵來開啟或關閉觸摸板&#xff0c;部分型號可能是 “FnF2”“FnF9” 等。如果不確定&#xff0c;可以查看鍵盤上的功能鍵圖標&#xff0c;一般有觸摸板圖案的按鍵就是觸摸板的快捷鍵。通過設備管理器…

使用Mybaitis-plus提供的各種的免寫SQL的Wrapper的使用方式

文章目錄 內連接JoinWrappers.lambda和 new MPJLambdaWrapper 生成的MPJLambdaWrapper對象有啥區別&#xff1f;LambdaQueryWrapper 和 QueryWrapper的區別&#xff1f;LambdaQueryWrapper和MPJLambdaQueryWrapper的區別&#xff1f;在作單表更新時建議使用&#xff1a;LambdaU…

基于微信小程序的走失兒童幫助系統-項目分享

基于微信小程序的走失兒童幫助系統-項目分享 項目介紹項目摘要管理員功能圖用戶功能圖系統功能圖項目預覽首頁走失兒童個人中心走失兒童管理 最后 項目介紹 使用者&#xff1a;管理員、用戶 開發技術&#xff1a;MySQLJavaSpringBootVue 項目摘要 本系統采用微信小程序進行開…

P3916 圖的遍歷

P3916 圖的遍歷 題目來源-洛谷 題意 有向圖中&#xff0c;找出每個節點能訪問到的最大的節點 思路 每個節點的最大節點&#xff0c;不是最長距離&#xff0c;如果是每個節點都用dfs去找最大值&#xff0c;顯然1e6*1e6 超時了&#xff0c;只能60分從第一個節點開始遍歷&…

掌握常見 HTTP 方法:GET、POST、PUT 到 CONNECT 全面梳理

今天面試還問了除了 get 和 post 方法還有其他請求方法嗎&#xff0c;一個都不知道&#xff0c;這里記錄下。 &#x1f310; 常見 HTTP 請求方法一覽 方法作用描述是否冪等是否常用GET獲取資源&#xff0c;參數一般拼接在 URL 中? 是? 常用POST創建資源 / 提交數據&#xff…

裸金屬服務器的應用場景有哪些?

隨著云計算技術不斷發展&#xff0c;裸金屬服務器作為一臺既具有傳統物理服務器特點的硬件設備&#xff0c;還具備云計算技術的服務器化服務功能&#xff0c;是硬件和軟件相結合的網絡設備&#xff0c;逐漸被越來越多的企業所關注&#xff0c;那么&#xff0c;裸金屬服務器的應…

【得物】20250419筆試算法題

文章目錄 前言第一題1. 題目描述2. 思路解析3. AC代碼 第二題1. 題目描述2. 思路解析3. AC代碼 第三題1. 題目描述2. 思路解析3. AC代碼 前言 三道題目都比較簡單&#xff0c;大家都可以試著做一下。 第一題 1. 題目描述 題目鏈接&#xff1a;矩陣變換 2. 思路解析 按題…

明遠智睿2351開發板四核1.4G Linux處理器:驅動創新的引擎

在科技日新月異的今天&#xff0c;創新成為了推動社會進步的核心動力。而在這場創新的浪潮中&#xff0c;一款性能卓越、功能全面的處理器無疑是不可或缺的引擎。今天&#xff0c;我們介紹的這款四核1.4G處理器搭配Linux系統的組合&#xff0c;正是這樣一款能夠驅動未來創新的強…

Oracle Database Resident Connection Pooling (DRCP) 白皮書閱讀筆記

本文為“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻譯加閱讀筆記。覺得是重點的就用粗體表示了。 白皮書版本為March 2025, Version 3.3&#xff0c;副標題為&#xff1a;Optimizing Oracle Database resou…

VS Code + GitHub:高效開發工作流指南

目錄 一、安裝 & 基本配置 1.下載 VS Code 2.安裝推薦插件(打開側邊欄 Extensions) 3.設置中文界面(可選) 二、使用 VS Code 操作 Git/GitHub 1.基本 Git 操作(不輸命令行!) 2.連接 GitHub(第一次使用) 三、克隆遠程倉庫到 VS Code 方法一(推薦): 方…

【LLM】llama.cpp:合并 GGUF 模型分片

GGUF&#xff08;GPT-Generated Unified Format&#xff09;是一種專為大規模語言模型設計的二進制文件格式&#xff0c;支持將模型分割成多個分片&#xff08;*-of-*.gguf&#xff09;。當從開源社區&#xff08;如 HuggingFace 或 ModelScope&#xff09;下載量化模型時&…

Ubuntu 系統下安裝和使用性能分析工具 perf

在 Ubuntu 系統下安裝和使用性能分析工具 perf 的步驟如下&#xff1a; 1. 安裝 perf perf 是 Linux 內核的一部分&#xff0c;通常通過安裝 linux-tools 包獲取&#xff1a; # 更新軟件包列表 sudo apt update# 安裝 perf&#xff08;根據當前內核版本自動匹配&#xff09; …

Buffer of Thoughts: Thought-Augmented Reasoningwith Large Language Models

CODE: NeurIPS 2024 https://github.com/YangLing0818/buffer-of-thought-llm Abstract 我們介紹了思想緩沖(BoT)&#xff0c;一種新穎而通用的思想增強推理方法&#xff0c;用于提高大型語言模型(大型語言模型)的準確性、效率和魯棒性。具體來說&#xff0c;我們提出了元緩沖…