React 19 新特性:Actions 和 useTransition

265 阅读1分钟

React 19 已正式发布稳定版本,并已在 npm 上提供!它集成了众多特性和增强功能,旨在简化开发流程、提升性能,并简化常见 UI 模式的处理。

本文主要介绍 React 19 新增的 Actions 概念和 useTransition 钩子的变化。

1、Actions

在 React 19 中,增加了对在转换中使用异步函数的支持,以自动处理挂起状态、错误、表单和乐观更新。这种使用异步转换的函数被称为 Actions。

2、useTransition

useTransition 在 React 19 中支持异步函数,可以用来自动处理挂起状态。

在使用 useTransition 之前,例如,当用户提交表单以更改其名称时,需要发出 API 请求,并处理响应,这些需要手动处理挂起状态、错误、乐观更新以及顺序请求。

看下面例子,在 useState 中手动处理挂起状态和错误状态:

// 使用 Actions 之前
function UpdateName({}) {
  const [name, setName] = useState("");
  const [error, setError] = useState(null);
  const [isPending, setIsPending] = useState(false);

  const handleSubmit = async () => {
    setIsPending(true);
    const error = await updateName(name);
    setIsPending(false);
    if (error) {
      setError(error);
      return;
    } 
    redirect("/path");
  };

  return (
    <div>
      <input value={name} onChange={(event) => setName(event.target.value)} />
      <button onClick={handleSubmit} disabled={isPending}>
        Update
      </button>
      {error && <p>{error}</p>}
    </div>
  );
}

当使用 useTransition 来处理挂起状态:

// 从 Actions 中获取挂起状态
function UpdateName({}) {
  const [name, setName] = useState("");
  const [error, setError] = useState(null);
  const [isPending, startTransition] = useTransition();

  const handleSubmit = () => {
    startTransition(async () => {
      const error = await updateName(name);
      if (error) {
        setError(error);
        return;
      } 
      redirect("/path");
    })
  };

  return (
    <div>
      <input value={name} onChange={(event) => setName(event.target.value)} />
      <button onClick={handleSubmit} disabled={isPending}>
        Update
      </button>
      {error && <p>{error}</p>}
    </div>
  );
}

异步转换会立即将 isPending 状态设置为 true,发起异步请求,并在任何转换完成后将 isPending 切换为 false。这样,省去了手动处理挂起状态,在数据变化的过程中,可以保持当前用户界面的响应性和交互性。