当前位置: 首页 > news >正文

React 组件和 Hook 必须是幂等的

React 中的一个核心概念是保持纯粹。一个纯组件或 Hook 应该是:幂等的 ——每次使用相同的输入(组件输入的 props、state、context 以及 Hook 输入的参数)运行它,你总是得到相同的结果。

组件必须始终根据其输入(props、state、和 context)返回相同的输出。这被称为“幂等性”。幂等性是函数式编程中经常使用的一个术语,它指的是只要你使用相同的输入运行代码, 得到的结果总是一样的。

这意味着,为了遵循这一规则,所有 在渲染期间 执行的代码也必须是幂等的。例如,以下这行代码就不是幂等的(因此,包含这行代码的组件也不是幂等的):

function Clock() { const time = new Date(); // 🔴 错误的:总是返回不同的结果! return <span>{time.toLocaleString()}</span>}

new Date() 函数不是幂等的,因为每次调用时返回的结果都不同,它总是返回调用时刻的日期和时间。当你渲染上面的组件时,屏幕上显示的时间将会停留在组件被渲染的那一刻的时间。类似地,像 Math.random() 这样的函数也不是幂等的,因为即使输入相同,它们每次调用也都会返回不同的结果。

这并不意味着你完全不能使用像 new Date() 这样非幂等的函数,你只需要避免 在渲染过程 中使用它们即可。在这种情况下,我们可以使用一个 Effect 来将最新的日期与这个组件进行“同步”:

import { useState, useEffect } from 'react'; function useTime() { // 1. 跟踪当前日期的状态。`useState` 接受一个初始化函数作为其 // 初始状态。它只在调用 Hook 时运行一次,因此只有调用 Hook 时的 // 当前日期才被首先设置。 const [time, setTime] = useState(() => new Date()); useEffect(() => { // 2. 使用 `setInterval` 每秒更新当前日期。 const id = setInterval(() => { setTime(new Date()); // ✅ 正确的:非幂等代码不再在渲染中运行。 }, 1000); // 3. 返回一个清理函数,这样我们就不会忘记清理 `setInterval` 定时器,导致内存泄漏。 return () => clearInterval(id); }, []); return time;} export default function Clock() { const time = useTime(); return <span>{time.toLocaleString()}</span>;}

通过将非幂等的 new Date() 调用包装在一个 Effect 中,就可以将这个计算移动到 渲染之外。

如果你不需要将某些外部状态与 React 同步,只需要在响应用户交互时更新,你可以考虑使用一个 事件处理函数。

http://www.jsqmd.com/news/605398/

相关文章:

  • seo优化软件入门知识_seo优化软件如何配置
  • OpenClaw:2026年最火个人AI助手,让AI真正帮你干活!
  • macOS下OpenClaw安装全攻略:百川2-13B-4bits量化版对接
  • 【Agentic API 实战】02 重新定义动作:掌握 ACTION 接口分类法
  • 文件夹变应用程序?数据恢复方法来了
  • FramePack实战指南:从零开始构建高效视频扩散工作流
  • 2000行代码实现教学级RISC-V操作系统解析
  • Lombok注解底层原理
  • 告别SRResNet:手把手教你复现NTIRE2017冠军模型EDSR(附PyTorch代码与BN层移除详解)
  • ESP32摄像头+MicroPython实战:5分钟搭建无线人脸检测系统(附完整代码)
  • OpenClaw资源监控:千问3.5-9B实现的系统健康报告
  • 网站seo排名工具有哪些
  • OpenClaw+Qwen3.5-9B科研助手:文献综述与实验设计自动化
  • 丹青识画部署教程:私有化部署中SSL证书与水墨UI HTTPS适配
  • AI Agent爆了!掌握MCP+Skill,2026年23%企业都在用的智能决策黑科技
  • 跨平台实战:Windows与Mac下OpenClaw对接百川2-13B-4bits差异详解
  • 5分钟体验OpenClaw:基于Qwen3.5-9B镜像的云端沙盒部署
  • iPad Mini2降级iOS 10.3.3避坑指南:从固件下载到iCloud绕过(A7芯片专用)
  • java-从零打造学生管理系统
  • OpenClaw安全加固:百川2-13B模型API的权限控制实践
  • BEV模型训练不再难:星图AI平台+PETRV2,新手友好教程
  • 易语言手游中控框架源码|逍遥模拟器专用模板
  • 从CTFT到FFT:六种傅里叶变换的演进与应用全景
  • 华为推送报错6003?手把手教你排查证书指纹不匹配问题(附详细日志抓取步骤)
  • 2026年不干胶复卷机梯队盘点:半自动模切分条复卷机、复卷机设备、无胶复卷机、标签复卷机、物流标签设备、空白标签设备选择指南 - 优质品牌商家
  • 用GD32F103C8T6的PWM驱动舵机:从接线到代码的保姆级教程(附源码)
  • 倩女幽魂手游全自动24小时系统|雷电模拟器多线程中控+自动倒米交易+智能喊话器(含易语言源码)
  • 紧急预警!银河麒麟文件剪切后数据“人间蒸发”?别慌,用数安寻3秒火速救援!
  • OpenClaw轻量部署:Qwen3-4B在树莓派上的优化运行
  • SDMatte命令行参数详解:从基础调用到高级功能的全配置指南