🚀 React 面试 20 题精选:基础 + 实战 + 代码解析

作为 React 开发者,深入理解 React 的关键概念对于拿下面试、写出高质量代码都至关重要。本文精心整理了 20 个高频面试问题,涵盖了从基础原理、核心 API 到性能优化与测试的各个方面。

💡 建议:在查看答案前,先自己尝试回答,再对照解析,能加深理解效果!


📚 目录

  1. [什么是 React?它的优势?](#什么是 React?它的优势? "#1")
  2. [虚拟 DOM 是什么?如何工作?](#虚拟 DOM 是什么?如何工作? "#2")
  3. [React 如何处理更新和渲染?](#React 如何处理更新和渲染? "#3")
  4. [React 中组件的概念](#React 中组件的概念 "#4")
  5. [什么是 JSX?为什么使用?](#什么是 JSX?为什么使用? "#5")
  6. [state 和 props 的区别](#state 和 props 的区别 "#6")
  7. [受控组件 vs 非受控组件](#受控组件 vs 非受控组件 "#7")
  8. [什么是 Redux?如何与 React 配合?](#什么是 Redux?如何与 React 配合? "#8")
  9. [什么是高阶组件 (HOC)?](#什么是高阶组件 (HOC)? "#9")
  10. [服务端渲染 vs 客户端渲染](#服务端渲染 vs 客户端渲染 "#10")
  11. [什么是 React Hooks?](#什么是 React Hooks? "#11")
  12. [React 中如何管理状态?](#React 中如何管理状态? "#12")
  13. [useEffect 是怎么工作的?](#useEffect 是怎么工作的? "#13")
  14. 再谈服务端渲染(SSR)
  15. [React 中的事件处理机制](#React 中的事件处理机制 "#15")
  16. [什么是 React Context?](#什么是 React Context? "#16")
  17. [React 如何实现路由?](#React 如何实现路由? "#17")
  18. 性能优化有哪些实践?
  19. [React 测试:框架与方式](#React 测试:框架与方式 "#19")
  20. [React 中的异步数据加载](#React 中的异步数据加载 "#20")

1. 什么是 React?它的优势?

React 是一个构建用户界面的 JavaScript 库,专注于 View 层。它允许开发者构建可组合的组件,高效渲染视图。

核心优势:

  • 🧩 组件化开发
  • ⚡ 虚拟 DOM 提高性能
  • 🔁 单向数据流,易于调试
  • 📦 丰富生态(如 Redux、React Router)

2. 什么是虚拟 DOM?它是如何工作的?

虚拟 DOM(Virtual DOM)是内存中的一种 JS 表示,它避免了频繁的 DOM 操作。

工作流程:

  1. 修改 state/props → 生成新的虚拟 DOM
  2. 旧虚拟 DOM vs 新虚拟 DOM 进行 diff
  3. React 根据变化更新真实 DOM(最小 patch)

3. React 如何更新和渲染组件?

  • 使用 setStateuseState 更新状态
  • 触发 Virtual DOM 重建
  • 执行 diff → 最小化 DOM 操作(协调阶段)
  • 更新 DOM & 触发 render

4. 组件是什么?如何定义?

组件是一个独立的 UI 单位,可以复用。React 支持:

jsx 复制代码
// 函数组件
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

// 类组件
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

5. 什么是 JSX?为什么使用?

JSX 是 JavaScript 的语法扩展,让我们在代码中写 HTML。

jsx 复制代码
const element = <h1 className="greeting">Hello, world!</h1>;

它最终会被 Babel 转换为:

js 复制代码
React.createElement('h1', { className: 'greeting' }, 'Hello, world!');

6. props vs state 区别

props state
外部传入,只读 组件内部可变数据
父组件传子组件 组件内部自己管理
不可修改 通过 setState 修改

7. 受控组件 vs 非受控组件

jsx 复制代码
// 受控组件
<input value={value} onChange={e => setValue(e.target.value)} />

// 非受控组件(使用 ref)
<input ref={inputRef} />
  • ✅ 受控组件优点:统一管理表单值,更易做校验和联动。
  • ❌ 非受控组件依赖原生 DOM 操作。

8. 什么是 Redux?如何与 React 配合?

Redux 是一个状态容器,三大原则:

  1. 单一状态树
  2. 状态只读(不可直接修改)
  3. 使用纯函数 reducer 更新状态

与 React 配合使用:

jsx 复制代码
import { Provider } from 'react-redux';

<Provider store={store}>
  <App />
</Provider>

组件中通过 useSelectoruseDispatch 获取状态和派发 action。


9. 什么是高阶组件 (HOC)?

高阶组件是一种模式:函数接收组件,返回新组件

jsx 复制代码
function withAuth(Component) {
  return function Enhanced(props) {
    return props.loggedIn ? <Component {...props} /> : <Login />;
  }
}

用途:抽离逻辑、增强功能、权限处理、复用等。


10. SSR vs CSR 有什么区别?

特性 SSR(服务端渲染) CSR(客户端渲染)
首屏速度 慢(需要 JS 执行)
SEO 好(直接返回 HTML) 差(依赖爬虫执行 JS)
动态交互 首次加载后通过 hydration 完全在客户端渲染

11. 什么是 Hooks?为什么重要?

Hooks 是函数组件中的特性,提供状态、生命周期、副作用等功能。

常用 Hook:

jsx 复制代码
const [count, setCount] = useState(0);

useEffect(() => {
  console.log('副作用');
}, [count]);

12. React 如何管理状态?

  • 使用 useState 管理局部状态
  • 使用 useReducer 管理复杂状态逻辑
  • 使用 context + reducer 共享全局状态
  • 使用 Redux / Zustand / Jotai 等状态管理库扩展能力

13. useEffect 是怎么工作的?

jsx 复制代码
useEffect(() => {
  // 副作用逻辑,如请求、订阅
  return () => {
    // 清理逻辑
  };
}, [dependencies]);
  • 会在组件渲染后执行
  • 依赖数组为空,只在首次运行
  • 可以处理定时器、API、DOM 操作等

14. SSR 再解释(深入)

React SSR 的核心 API 是 ReactDOMServer.renderToString()

用途:

  • SEO 要求高的应用(如博客、电商)
  • 提高首屏加载性能
  • 常见框架:Next.js、Remix

15. React 中如何处理事件?

jsx 复制代码
<button onClick={handleClick}>Click Me</button>

function handleClick(event) {
  console.log(event.target);
}
  • 使用驼峰式命名(如 onClick
  • 合成事件系统(跨浏览器兼容)
  • 可使用 e.preventDefault() 等标准方法

16. 什么是 Context?

Context 用于"跨组件传值",避免 props 层层传递。

jsx 复制代码
const ThemeContext = createContext('light');

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Toolbar() {
  const theme = useContext(ThemeContext);
  return <div className={`theme-${theme}`}>主题内容</div>;
}

17. React 路由怎么实现?

使用 React Router

jsx 复制代码
<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/about" element={<About />} />
  </Routes>
</BrowserRouter>
  • 支持嵌套路由、动态路由、懒加载等

18. 性能优化建议有哪些?

  • 使用 React.memo 避免不必要渲染
  • 合理拆分组件
  • 使用懒加载(React.lazy
  • 利用 key 优化列表渲染
  • 减少匿名函数创建

19. 如何测试 React 应用?

主流测试工具:

  • Jest:单元测试框架(官方推荐)
  • React Testing Library:组件行为测试(更偏用户体验)
  • Cypress / Playwright:端到端测试(E2E)

示例:

js 复制代码
test('按钮点击次数增加', () => {
  render(<Counter />);
  fireEvent.click(screen.getByText('Add'));
  expect(screen.getByText('Count: 1')).toBeInTheDocument();
});

20. 如何处理异步请求?

jsx 复制代码
const [data, setData] = useState(null);

useEffect(() => {
  fetch('/api/data')
    .then(res => res.json())
    .then(setData)
    .catch(console.error);
}, []);

实践建议:使用 axios + try/catch 更好控制错误,结合 loading/error 状态增强 UX。


✅ 总结

这份 20 个问题的清单涵盖了 React 面试的主干内容。掌握它们将帮助你:

  • 💼 面试自信回答
  • 🧠 加深对 React 底层机制的理解
  • 📈 写出更高质量、更稳定的代码

如果你想继续深入,建议关注:

  • 官方文档(react.dev
  • 框架实践(Next.js、Remix)
  • 实战项目与测试驱动开发
相关推荐
前端大卫6 小时前
Vue3 + Element-Plus 自定义虚拟表格滚动实现方案【附源码】
前端
却尘6 小时前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare6 小时前
浅浅看一下设计模式
前端
Lee川7 小时前
🎬 从标签到屏幕:揭秘现代网页构建与适配之道
前端·面试
Ticnix7 小时前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人7 小时前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl7 小时前
OpenClaw 深度技术解析
前端
崔庆才丨静觅7 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人7 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼7 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端