news 2026/5/1 11:14:24

【回顾React的一些小细节】render里不可包含的东西

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【回顾React的一些小细节】render里不可包含的东西

在 React 的render()(或函数组件的渲染路径)中

不应包含

  • 副作用(Side effects): 如网络请求、订阅、定时器、I/O、路由跳转等。

    • 为什么:render 应是纯函数,副作用会在每次渲染重复执行或引发循环。
    • 替代:类组件放componentDidMount/componentDidUpdate,函数组件放useEffect(并正确设置依赖)。
  • 调用setState或 导致状态变化的操作: 直接或间接在 render 里调用setState会立即触发新渲染,容易导致无限循环。

    • 替代:把状态更新放到事件回调、生命周期、或 effect 中。
  • 直接修改this.state或可变数据(Mutation): 如this.state.obj.x = 1array.push()

    • 为什么:会破坏不可变性,导致难以追踪的渲染问题。
    • 替代:使用不可变拷贝:const next = {...this.state.obj, x:1}const nextArr = [...arr, item]
  • 长时间或昂贵的计算: CPU 密集型操作会阻塞渲染导致卡顿。

    • 替代:使用useMemo/memo/PureComponent或把计算异步化/提前计算。
  • 创建新的函数/对象引用(频繁): 在渲染每次都新建匿名函数或对象(如onClick={() => doX()}style={{}})会使子组件收到不同引用,触发不必要重渲染。

    • 替代:用 class 方法、useCallbackuseMemo或提前提取常量。
  • 直接操作 DOM 或添加事件监听: 如document.addEventListener、手动修改节点。

    • 替代:使用 refs + 在componentDidMount/useEffect中进行,并在卸载时清理。
  • 异步/await 表达式: render 不能是异步函数,返回值必须是 React 元素或null

    • 替代:在 effect 中做异步工作,状态准备好后渲染。
  • 非确定性副作用(例如导航、弹窗、全局状态修改): 这些在每次渲染时重复执行会造成 UX/状态错乱。

    • 替代:通过事件或 effect 控制一次性/受控触发。
  • 抛出异常的操作(未捕捉): 如果 render 抛错会破坏整棵组件树(除非有 ErrorBoundary)。

    • 替代:在渲染前验证数据,或在渲染外做可能失败的逻辑并保留安全值。

常见错误示例(错误)

// 错误:每次 render 都会创建定时器并在回调里 setState -> 无限循环 render() { setTimeout(() => this.setState({ x: 1 }), 1000); return <div>{this.state.x}</div>; }

正确写法(类组件)

componentDidMount() { this.timer = setTimeout(() => this.setState({ x: 1 }), 1000); } componentWillUnmount() { clearTimeout(this.timer); } render() { return <div>{this.state.x}</div>; }

正确写法(函数组件 + Hook)

useEffect(() => { const id = setTimeout(() => setX(1), 1000); return () => clearTimeout(id); }, []); // 空依赖:只在挂载时执行一次

(排查 render 问题时用)

  • render 中有没有setState/setTimeout/fetch/addEventListener?若有,把它们移动到 effect 或生命周期。
  • 是否直接修改state或 props 的对象/数组?若是,改为不可变更新。
  • 是否每次渲染都创建了新的函数/对象作为 prop?考虑useCallback/useMemo
  • 是否在组件卸载时清理了订阅或计时器?(componentWillUnmount/ effect cleanup)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 8:13:30

文生中英双语的AI视频工具怎么选?一个英语老师的实测结论

如果你是英语老师&#xff0c;正在找文生中英双语的AI视频工具&#xff0c;那我几乎可以确定—— 你遇到的问题&#xff0c;和我一模一样。不是不会讲英语&#xff0c;也不是不会设计内容&#xff0c;而是&#xff1a;双语视频根本做不完。在我正式给结论之前&#xff0c;先把最…

作者头像 李华
网站建设 2026/5/1 7:30:43

PostgreSQL_note2025

SELECT pg_get_functiondef(p.oid) AS ddl_definition FROM pg_proc p JOIN pg_namespace n ON p.pronamespace n.oid WHERE n.nspname ‘ods’ – 模式名 AND p.proname ‘xxxxxxxx’; – 存储过程名 –表信息 select c.relname table_name, nsp.nspn…

作者头像 李华
网站建设 2026/4/29 0:52:47

鸿蒙Electron应用性能优化与稳定性保障:从流畅运行到可靠服务

结合前文对开发、UX优化及商业化评估的全面覆盖&#xff0c;本次将聚焦鸿蒙Electron应用的“性能优化与稳定性保障”&#xff0c;从“性能瓶颈定位、核心优化方案、稳定性监控体系”三个维度&#xff0c;提供可落地的性能调优策略与稳定性保障方案&#xff0c;解决Electron应用…

作者头像 李华
网站建设 2026/5/1 9:54:20

35岁大龄程序员破局指南:突破“中年危机”魔咒,开启职业第二春!

“35岁危机”曾是悬在程序员头顶的达摩克利斯之剑&#xff0c;但在技术快速迭代的今天&#xff0c;这条年龄线甚至被提前到了30岁。根据某一线互联网公司内部数据&#xff0c;35岁以上程序员主动离职率比30岁以下高出40% &#xff0c;而再就业周期平均延长3-6个月。 这不仅是年…

作者头像 李华
网站建设 2026/5/1 1:40:56

5.3 LlamaFactory 微调实战:微调 Qwen DeepSeek 模型

LlamaFactory 微调实战:微调 Qwen/DeepSeek 模型 导语:理论的尽头是实践。我们已经理解了 LoRA 的原理,并学会了如何“指挥”GPT-4 为我们生产高质量的微调数据。现在,万事俱备,只欠“开炉炼丹”。本章将是一次纯粹的、从头到尾的动手实战。我们将使用 LlamaFactory,一个…

作者头像 李华
网站建设 2026/5/1 1:41:44

5.8 垂直领域 Agent 的未来:探索模型微调在金融、法律等行业的应用

5.8 垂直领域 Agent 的未来:探索模型微调在金融、法律等行业的应用 导语:在本课程的最后一章,让我们将目光从具体的代码和技术细节中抬起,投向更广阔的星辰大海。我们已经通过“AI 皮肤科医生”项目,亲眼见证了模型微调如何将一个通用模型“点化”为垂直领域的专家。然而,…

作者头像 李华