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

【React】useId

在 React 中,useId 是 React 18 引入的一个 Hook,用于生成一个在组件生命周期中保持稳定的唯一 ID。它主要用于:

  • 无障碍(accessibility)场景,比如表单控件需要一个 idlabelhtmlFor 属性配对。
  • 服务端渲染(SSR) 与客户端渲染保持一致。
  • 避免多个组件生成的 ID 冲突。

🧠 为什么不用自己写 id

以前开发者会自己写逻辑生成 id,比如用 Math.random()Date.now()uuid 生成,但这些在服务端渲染(SSR)和客户端渲染中可能不一致,从而导致 水合(hydration)错误

SSR:服务端渲染出 html 内容,发给浏览器,浏览器接收到 html,先展示静态内容,然后加载动态js,就是将html激活(水合),然后就生成了动态应用,但是这样服务端和浏览器端的 id 生成就会不同(可能随机数生成等等)。


useId 的基本语法

const id = useId();
  • id 是一个 字符串,React 会自动加前缀,确保唯一性。

🧪 示例:表单中 label 与 input 关联

import React, { useId } from 'react';function NameInput() {const id = useId();return (<div><label htmlFor={id}>姓名:</label><input id={id} type="text" /></div>);
}

在这个例子中:

  • labelhtmlForinputid 使用同一个值。
  • useId() 保证了 ID 在每次渲染中一致,适用于 SSR。

🧩 示例:多个组件实例

function InputField({ label }) {const id = useId();return (<div><label htmlFor={id}>{label}</label><input id={id} type="text" /></div>);
}function Form() {return (<><InputField label="用户名" /><InputField label="邮箱" /></>);
}

每个 InputField 都会生成不同的 id,即使组件重复使用也不会冲突。


⚠️ 注意事项

  1. useId 不能用在事件处理函数或条件判断内部
  2. 它不能替代 key、uuid 等复杂 ID 生成需求(比如数据库 ID)。
  3. 如果你要生成 带后缀的 ID,可以这样做:
const id = useId();
<input id={`${id}-email`} />

🎯 适用场景总结

场景是否推荐用 useId
labelinput/textarea 等的 ID 配对✅ 是
ARIA 属性如 aria-labelledby✅ 是
SSR 页面保持一致性✅ 是
用于生成数据库 ID、URL 等❌ 否

如果在使用 React 17 或更低版本,可以用第三方库如 uuidnanoid 作为替代,但在 React 18+ 推荐用 useId 来保证一致性和性能。

http://www.lryc.cn/news/2403032.html

相关文章:

  • 【51单片机】0. 基础软件安装
  • 集成电路设计:从概念到实现的完整解析优雅草卓伊凡
  • 动态规划之网格图模型(二)
  • uniapp 集成腾讯云 IM 消息搜索功能
  • robot_lab——rsl_rl的train.py整体逻辑
  • AI推荐系统演进史:从协同过滤到图神经网络与强化学习的融合
  • Java-IO流之压缩与解压缩流详解
  • .NET 原生驾驭 AI 新基建实战系列(三):Chroma ── 轻松构建智能应用的向量数据库
  • 有声书画本
  • StarRocks与Apache Iceberg:构建高效湖仓一体的实时分析平台
  • WebRTC 与 WebSocket 的关联关系
  • 8.RV1126-OPENCV 视频中添加LOGO
  • API管理是什么?API自动化测试怎么搭建?
  • Next.js+prisma开发一
  • GIC v3 v4 虚拟化架构
  • 2025远离Deno和Fresh
  • 相机camera开发之差异对比核查一:测试机和对比机的硬件配置差异对比
  • Flask+LayUI开发手记(七):头像的上传及突破static目录限制
  • uv管理spaCy语言模型
  • MiniExcel模板填充Excel导出
  • NoSQL之redis哨兵
  • MCP协议重构AI Agent生态:万能插槽如何终结工具孤岛?
  • 阿里云事件总线 EventBridge 正式商业化,构建智能化时代的企业级云上事件枢纽
  • CentOS8.3+Kubernetes1.32.5+Docker28.2.2高可用集群二进制部署
  • 学习日记-day23-6.6
  • Pytorch安装后 如何快速查看经典的网络模型.py文件(例如Alexnet,VGG)(已解决)
  • 《ERP原理与应用教程》第3版习题和答案
  • JavaScript中的正则表达式:文本处理的瑞士军刀
  • vue对axios的封装和使用
  • 软考 系统架构设计师系列知识点之杂项集萃(82)