ZxdNoob
首页文章简历版本历史AI 向导

ZxdNoob

用心记录,认真生活

按 ⌘K 快速导航到任意页面按 ⌘I 打开 AI 向导(或访问 /agent)

导航

  • 首页
  • 简历
  • 版本历史
  • AI 向导

更多

  • GitHub
  • Sitemap

© 2026 ZxdNoob. All rights reserved.

Built with Next.js · Styled with Tailwind CSS

返回文章列表
2026年4月4日 08:30:002 分钟阅读

前端面试准备 04:React 核心——渲染、更新、Hooks 心智模型、并发与 SSR(面试表达模板)

用“渲染=计算 UI”与“更新=调度”两句话讲清 React:Hooks 规则、闭包陷阱、性能优化点、并发渲染与 SSR/Streaming 的取舍。

  • 前端面试
  • React
  • Hooks
  • SSR
AI 共读让 Noob 帮你提炼要点 / 答疑

React 面试最怕“讲不清自己写的东西”。这一篇给你一套表达框架。

01 两句话讲清 React#

  • 渲染(render):根据 state/props 计算 UI(纯计算,尽量无副作用)
  • 更新(commit):把变化应用到宿主环境(DOM),并执行副作用(effects)

如果你能围绕这两句话解释 hooks、性能与并发,大多数追问都能接住。

02 Hooks 心智模型:闭包陷阱为什么会发生#

必会点:

  • 组件函数每次渲染都会重新执行
  • effect 的回调捕获的是当次渲染的变量(闭包)
  • 依赖数组是“告诉 React 何时重新订阅/重新执行副作用”

高频追问:

  • 为什么不能在条件语句里调用 hooks?
  • useMemo/useCallback 什么时候是负收益?
  • 如何避免 stale closure?(依赖、ref、函数式 setState)

03 性能:先定位,再优化(别上来就 memo)#

面试表达建议:

  • 先说“如何定位”:React DevTools Profiler
  • 再说“如何优化”:拆分组件、稳定 props、列表虚拟化、避免不必要的 state 上提

04 并发与 Suspense:你不需要背实现,但要会讲取舍#

你要能说清:

  • 并发渲染让 React 可以中断/恢复渲染(更好的响应)
  • Suspense 是“声明式的加载边界”

05 SSR/Streaming:从“SEO”升级到“性能/体验”#

你要能讲清:

  • SSR 的收益:更快首屏内容到达、SEO、分享预览
  • SSR 的成本:服务端负载、缓存复杂度、同构边界(浏览器 API)
  • Streaming 的意义:更早把可用内容送到客户端

06 自测清单#

  • 我能解释一次“组件为什么重渲染”并给出定位方法吗?
  • 我能讲清一个 effect 依赖问题的根因与修复吗?
  • 我能描述 SSR 的收益与代价,并给出适用场景吗?

07 练习题(笔试 + 示例代码 + 原理)#

题 1(问答):为什么说“React 渲染是计算 UI,副作用属于 effect”?#

参考答案(原理)#

  • 渲染阶段可能被打断/重做(尤其在并发模式下)
  • 如果在渲染阶段做副作用(订阅、请求、改 DOM),会导致重复执行、状态错乱
  • effect 运行在 commit 之后,React 能保证 DOM 已经更新,并且能在依赖变化/卸载时清理

题 2(输出题):stale closure#

function Demo() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    const id = setInterval(() => {
      console.log(count);
      setCount(count + 1);
    }, 1000);
    return () => clearInterval(id);
  }, []);
  return <div>{count}</div>;
}

这段代码有什么问题?如何修复?为什么?

参考答案(原理)#

  • effect 依赖数组为空,回调捕获的是初始渲染的 count=0
  • 定时器里永远读到 0,并且 setCount(count + 1) 永远设置为 1

修复方式 1:使用函数式更新(不依赖闭包里的 count):

setCount((c) => c + 1);

修复方式 2:把 count 放进依赖数组(会导致 interval 重建,通常不如函数式更新合适)。

题 3(编码题):实现一个 useLatest#

目标:解决闭包读旧值的问题。

export function useLatest<T>(value: T) {
  // TODO
}

参考答案(原理 + 代码)#

原理:ref 在组件生命周期内稳定,更新 ref 不会触发渲染,适合承载“最新值供回调读取”。

import { useRef } from 'react';

export function useLatest<T>(value: T) {
  const ref = useRef(value);
  ref.current = value;
  return ref;
}

下一篇进入工程化:构建、依赖、质量体系与发布流程,是 8 年工程师最能拉开差距的部分。

相关阅读

基于内容相似度 + 标签/系列加权

  • 2026年4月3日 06:30:002 分钟前端面试准备(8 年一线工程师知识体系与学习路线)
    01

    前端面试准备 03:浏览器与网络——渲染流水线、缓存、CORS、Cookie、HTTP/2(高频追问一网打尽)

    把浏览器与网络题整理成“从输入到像素”的链路:渲染流水线、回流重绘、合成、缓存策略、CORS、Cookie/SameSite、HTTP/2/3。

    • 前端面试
    • 浏览器
    • 网络
  • 2026年4月2日 04:00:003 分钟前端面试准备(8 年一线工程师知识体系与学习路线)
    02

    前端面试准备 02:TypeScript 工程能力——类型系统、泛型、条件类型与“类型体操”的边界

    TS 面试别只讲 keyof/extends:要能说清类型系统能力边界、如何在团队里落地、如何避免类型体操失控。附高频类型题与工程规范。

    • 前端面试
    • TypeScript
    • 工程化
  • 2026年4月5日 10:30:001 分钟前端面试准备(8 年一线工程师知识体系与学习路线)
    03

    前端面试准备 05:工程化——构建、依赖治理、质量体系、CI/CD 与发布回滚

    工程化题的本质是“可持续交付”。从构建与依赖图、代码分割、质量门禁、测试金字塔到灰度发布与回滚,把面试回答讲成“我在团队里怎么做”。

    • 前端面试
    • 工程化
    • CI/CD
  • 2026年4月1日 12:30:007 分钟前端面试准备(8 年一线工程师知识体系与学习路线)
    04

    前端面试准备 01:JavaScript 运行时——执行上下文、闭包、原型链与事件循环(能推导版)

    把 JS 面试高频点组织成“可推导”的模型:执行上下文/作用域链/this/原型链/事件循环。附典型追问、手写题拆解与易错边界。

    • 前端面试
    • JavaScript
    • 运行时
返回文章列表

目录

13
  1. 01 两句话讲清 React
  2. 02 Hooks 心智模型:闭包陷阱为什么会发生
  3. 03 性能:先定位,再优化(别上来就 memo)
  4. 04 并发与 Suspense:你不需要背实现,但要会讲取舍
  5. 05 SSR/Streaming:从“SEO”升级到“性能/体验”
  6. 06 自测清单
  7. 07 练习题(笔试 + 示例代码 + 原理)
  8. 题 1(问答):为什么说“React 渲染是计算 UI,副作用属于 effect”?
  9. 参考答案(原理)
  10. 题 2(输出题):stale closure
  11. 参考答案(原理)
  12. 题 3(编码题):实现一个 `useLatest`
  13. 参考答案(原理 + 代码)
进入沉浸式阅读