React 中的 useId 钩子用于生成唯一标识符(id)。生成的 id 的格式是冒号后跟字母“r”,然后是数字,最后是另一个冒号(例如,“:r1:”、“:r2:”)。
您可能想知道为什么我们需要如此非常规的 ID 格式。原因就在于它的独特性。使用输入和标签时,使用 label 标签连接它们被认为是最佳实践。这种连接允许方便的用户交互,特别是对于单击关联标签比单击复选框本身更容易的复选框。
然而,有些情况下我们不能直接用 label 标签包裹输入。在这种情况下,我们可以使用 label 标签的 htmlFor 属性,通过传递输入元素的 id 来建立与输入的连接。接下来的挑战就变成为此目的生成一个唯一的 ID。
useId 钩子通过生成一个唯一的 id 值来解决这个问题。它减轻了我们提供有意义的变量名称或 ID 的负担。React 的 useId hook 确保生成的 id 在组件内是唯一的。
现在,让我们来解释一下为什么 useId 钩子是 React 生态系统不可或缺的一部分。原因之一是服务器端渲染 (SSR)。React不仅可以运行在客户端,也可以运行在服务器端。如果我们使用像 uuid 这样的库来生成 id,那么服务器上的 id 值将与客户端上的 id 值不同。这种不匹配会导致错误和不一致。
React 的 useId hook 通过在 SSR 期间在服务器和客户端上提供相同的 id 来解决这个问题。它通过使用共享的 treeId 作为基本 id 来实现这一点。请注意,useId 生成的 id 仅在组件内是唯一的。如果在一个组件内使用多个 useId 挂钩,它们将共享相同的 treeId。
React 中 useId hook 的实现涉及两个函数:mountId 和 updateId。前者在组件最初渲染或安装时调用,而后者在后续更新期间调用。这种分离允许更灵活的代码,而不需要过多的条件逻辑。
mountId 函数通过组合 treeId 和特定于当前组件的本地计数器来生成 id。每次在组件内使用 useId 挂钩时,该计数器都会递增,以确保该组件内的唯一性。
对于单页应用程序 (SPA),全局计数器用于在整个 React 应用程序中生成 id。该计数器确保每个 useId 挂钩接收一个唯一的 id。但需要注意的是,当一个组件(例如模态窗口)被多次挂载时,每次都会生成一个新的 id。没有任何机制可以保留以前的 id。
总之,useId hook 是 React 中一个很有价值的工具,它可以满足生成唯一 id 的需求。它包含在 React 生态系统中,确保在 SSR 期间服务器和客户端之间生成一致的 id。生成的 id 在 React 应用程序中是非持久且唯一的。如果您的项目包含多个React应用程序,建议使用标识符前缀以避免id冲突。
文章转义来自:dev.to/farhadasadz…