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

【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.xdnf.cn/news/12263.html

相关文章:

  • OpenVINO环境配置--OpenVINO安装
  • excel数据对比找不同:6种方法核对两列数据差异
  • 基于 actix-web 框架的简单 demo
  • 业务系统对接大模型的基础方案:架构设计与关键步骤
  • Flink在B站的大规模云原生实践
  • 2025年- H73-Lc181--22.括号生成(回溯,组合)--Java版
  • 【C++进阶篇】C++11新特性(中篇)
  • AI辅助编程30天学习计划
  • JavaScript 循环方法对比指南
  • python基础day05
  • 【Hot 100】322. 零钱兑换
  • ABB 1MRK002247-Apr04保护继电器模块技术分析
  • 示波器电流探头校准规范指南
  • 操作系统中的设备管理,Linux下的I/O
  • mime嗅探的默认行为及Markdown文件响应格式
  • 小白升级的路-电子电路
  • Openldap 数据迁移后用户条目中 memberOf 反向属性丢失
  • 物料转运人形机器人适合应用于那些行业?解锁千行百业的智慧物流革命
  • 【Fiddler抓取手机数据包】
  • BT Panel密码修改
  • C语言| 指针引用数组元素
  • Windows上共享文件夹给Linux使用
  • 技术文档写作全攻略
  • 仿真每日一练 | Workbench手机后盖壳体类静力学分析
  • ROUGE评测指标深度解析
  • AD-线宽规则和过孔规则不生效
  • 在MATLAB中使用自定义的ROS2消息
  • MySQL中关于事务和锁的常见执行命令整理包括版本区别
  • Git Patch 使用详解:生成、应用与多提交合并导出
  • 炉石传说 第八次CCF-CSP计算机软件能力认证