理解 React 18 中的 useId Hooks

简介: 理解 React 18 中的 useId Hooks

React 18 带有许多特性,例如自动批处理、并发和新的 Hooks。

这些 Hooks 通常都有非常明确的使用目的,比如 useTransition 用于处理 React 中的转换;useSyncExternalStore 用来读取外部数据源。

本文将深入探讨 useId ,它的用途以及一些其他方案的对比。


同构:useId 和 random、uuid


同构是指在服务器端和客户端之间共享相同的代码,这意味着服务器端代码也可以在客户端运行。

React 支持开箱即用的同构,在同构应用中渲染列表时,如果我们没有一个唯一的 id,很多人习惯使用 Math.random 或类似 uuid 这样的库来生成一个唯一 id。但这些方法有一个共同的缺点:当程序运行时,由服务端生成的 uuid 或 Math.random 会和客户端生成的不同。

这种 id 不匹配会导致水合和可访问性的问题。

在 useId 之前,React 有一个 useOpaqueIdentifier Hook,它是 useId 的第一个版本,但是它有很多问题。经过 React 团队的重构,它被重命名为 useId。

useId 的作用非常简单,生成一个唯一且稳定的 id,可以在应用的服务端或客户端使用。useId 生成的 Id 无论是在服务器端还是客户端都是稳定的。

id 还负责处理可访问性问题,这意味着可访问性 API 可以使用这些 id 将组件链接在一起。使用 useId 也可以解决水合问题。


useId 使用方法


使用 useId 非常简单,只需调用 useId,它会返回一个值,然后使用这个值就可以了。具体示例可以看下面的代码:


import { useId } from 'react';
import './App.css';
function App() {
  const firstId = useId();
  const secondId = useId()
  return <div className="App">
    <h3>The first id generated is {firstId}</h3>
    <h3>The second id generated is {secondId} and different from {firstId} </h3>
  </div>;
}
export default App;

首先从 React 导入 useId。接下来从 useId 中获取两个随机 id,并在我们的组件中显示这些 id。我们看到的页面应该如下图所示:

image.png


在表单中使用 useId


使用 useId 的另外一个场景是表单。

我们可以给 useId 添加附加信息,拼接出唯一的字符串。如下面的代码所示:


import { useId } from 'react';
import './App.css';
function App() {
  const firstId = useId();
  const secondId = useId();
  return (
    <div className="App">
      <form>
        <div>
          <label htmlFor={`${firstId}-email`}>Email</label>
          <input id={`${firstId}-email`} type="text" placeholder="Your email" />
        </div>
        <div>
          <label htmlFor={`${secondId}-password`}>Password</label>
          <input
            id={`${secondId}-password`}
            type="password"
            placeholder="Your password"
          />
        </div>
      </form>
    </div>
  );
}
export default App;

在上面的代码中,我们将附加信息附加到生成的 ID 中,比如 xx-email。这种方法可以将额外的信息添加到生成的 ID 中。

你可以看到下图所示的结果:

image.png


什么时候使用 useId?什么时候不用?


我们现在已经了解了 useId 的用处;接下来要知道的事情就是要知道该在什么时候使用它,什么时候不使用它。

你应该在以下情况下使用 useId:

  • 你想生成唯一 ID
  • 你想要连接 HTML 元素,比如 label 和 input。

在以下情况下不应该使用 useId:

  • 映射列表后需要 key。
  • 你需要定位 CSS 选择器。useId 会返回一个包含冒号的字符串,如上面的示例所示。CSS 选择器不支持从 useId 中生成的字符串。
  • 你正在使用不可变的值。



相关文章
|
14天前
|
前端开发 JavaScript
深入理解并实践React Hooks —— useEffect与useState
深入理解并实践React Hooks —— useEffect与useState
66 1
|
3天前
|
前端开发 JavaScript
React_函数式Hooks和Class比较优缺点
React Hooks与Class组件都能返回JSX并接收props,但Hooks无`this`指向问题,用`useEffect`模拟生命周期,`memo`优化性能,状态更新用`useState`;Class组件通过生命周期方法、`PureComponent`或`shouldComponentUpdate`优化,状态用`this.state`和`this.setState`管理。
13 1
React_函数式Hooks和Class比较优缺点
|
3天前
|
前端开发 JavaScript
React中函数式Hooks之useRef的使用
React中函数式Hooks的useRef用于获取DOM元素的引用,示例代码演示了其基本用法。
16 3
|
3天前
|
前端开发
React中函数式Hooks之useEffect的使用
本文通过示例代码讲解了React中`useEffect` Hook的用法,包括模拟生命周期、监听状态和清理资源。
15 2
React中函数式Hooks之useEffect的使用
|
2天前
|
前端开发 JavaScript API
深入探索React Hooks与状态管理
深入探索React Hooks与状态管理
12 2
|
4天前
|
前端开发 JavaScript 开发者
React的useId,现在Vue3.5终于也有了!
【9月更文挑战第22天】React 的 `useId` 功能已在 Vue 3.5 中引入,用于生成唯一 ID,提升开发效率,确保组件 ID 的一致性和增强应用的可访问性。开发者能更简便地管理唯一标识符,减少繁琐工作,同时保证在服务器和客户端渲染下的稳定性。这一改进使得 Vue 应用更加高效、易用和可靠。
|
10天前
|
前端开发 JavaScript 开发者
深入探索React Hooks的魔力
深入探索React Hooks的魔力
38 10
|
3天前
|
缓存 前端开发
React中函数式Hooks之memo、useCallback的使用以及useMemo、useCallback的区别
React中的`memo`是高阶组件,类似于类组件的`PureComponent`,用于避免不必要的渲染。`useCallback` Hook 用于缓存函数,避免在每次渲染时都创建新的函数实例。`memo`可以接收一个比较函数作为第二个参数,以确定是否需要重新渲染组件。`useMemo`用于缓存计算结果,避免重复计算。两者都可以用来优化性能,但适用场景不同:`memo`用于组件,`useMemo`和`useCallback`用于值和函数的缓存。
16 1
|
3天前
|
前端开发
React中函数式Hooks之useState的使用
本文介绍了React中函数式组件的Hooks——`useState`的使用方法。`useState`允许在函数式组件中使用状态,它返回一个数组,其中包含当前状态的值和更新该状态的函数。文章通过示例代码展示了如何声明状态变量和更新状态变量,包括对数值和对象状态的更新。此外,还展示了如何通过点击按钮触发状态更新,实现交互功能。
12 1
|
3天前
|
前端开发
React使用hooks遇到的坑_state中的某几个属性数据变成了空字符
本文讨论了在React使用hooks时遇到的一个问题:state中的某些属性数据变成了空字符。作者通过在修改函数中重新解构赋值来获取最新的state值,解决了因数据更新不及时导致的问题。
12 0

热门文章

最新文章