【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 来保证一致性和性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值