字节笔记本字节笔记本

React 19 RC useActionState 的使用

2024-06-27

React 19 RC 引入了 `useActionState` hook,简化了表单提交和状态管理,使代码更简洁直观。

React 最近发布了 React 19 RC 版本,带来了许多新功能和改进。本文主要介绍其中的 useActionState hook,以及如何结合 Astro Actions 使用。

介绍 useActionState

useActionState 是 React 19 中引入的一个新 hook,用于简化处理表单提交和状态管理。它接受一个异步操作和默认值,并返回当前的状态、提交函数和加载状态。这个 hook 主要解决了在表单提交时的繁琐状态管理问题,使代码更加简洁和直观。

没有 useActionState 之前

在引入 useActionState 之前,我们通常需要手动管理状态和异步操作。例如,处理一个简单的表单提交:

import { useState } from 'react';

function Form() {
  const [name, setName] = useState('');
  const [isPending, setIsPending] = useState(false);
  const [response, setResponse] = useState(null);
  const [error, setError] = useState(null);

  const handleSubmit = async (e) => {
    e.preventDefault();
    setIsPending(true);
    try {
      const res = await fetch('/api/updateName', {
        method: 'POST',
        body: JSON.stringify({ name }),
      });
      const data = await res.json();
      setResponse(data);
    } catch (err) {
      setError(err.message);
    } finally {
      setIsPending(false);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" value={name} onChange={(e) => setName(e.target.value)} />
      <button type="submit" disabled={isPending}>Update</button>
      {isPending && <p>Updating...</p>}
      {error && <p>{error}</p>}
      {response && <p>{response.message}</p>}
    </form>
  );
}

这段代码需要手动管理多个状态,并处理表单的提交逻辑。

使用 useActionState

有了 useActionState,代码变得更为简洁。以下是使用 useActionState 的例子:

import { useActionState } from 'react';

function Form() {
  const [state, submitAction, isPending] = useActionState(
    async (name) => {
      const res = await fetch('/api/updateName', {
        method: 'POST',
        body: JSON.stringify({ name }),
      });
      return res.json();
    },
    ''
  );

  return (
    <form action={submitAction}>
      <input type="text" name="name" placeholder="name" />
      <button type="submit" disabled={isPending}>Update</button>
      {isPending && <p>Updating...</p>}
      {state && <p>{state.message}</p>}
    </form>
  );
}

useActionState 接受一个异步操作和默认值,返回当前的状态、提交函数和加载状态。这样,我们只需要关注表单的提交逻辑,而不用手动管理多个状态。