Выбор ответа Middle Формы обновлено

Аргументы функции в useActionState

Вопрос

Форма отправлена, но formData.get падает с ошибкой «formData.get is not a function». Почему?

async function save(formData) {
  const title = formData.get('title');
  await api.save(title);
  return { ok: true };
}

function Editor() {
  const [state, formAction, isPending] = useActionState(save, null);
  return (
    <form action={formAction}>
      <input name="title" />
      <button disabled={isPending}>Сохранить</button>
    </form>
  );
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Action получает первым аргументом прошлое состояние, FormData вторым. Сигнатура action для useActionState: (prevState, formData) = newState.

Варианты ответа

  1. useActionState работает лишь с серверными функциями, а save клиентская
  2. Нужно вызывать formAction(formData) вручную в onSubmit формы
  3. FormData недоступен в клиентских компонентах, только на сервере
  4. Action получает первым аргументом прошлое состояние, FormData вторымправильный ответ

Разбор

Сигнатура action для useActionState: (prevState, formData) => newState. Здесь первым параметром пришёл null (начальное состояние), а у него нет метода get. Исправление: async function save(prev, formData).

  • useActionState работает и с обычными клиентскими async-функциями.
  • formAction передаётся в action формы, React сам вызовет его с FormData.
  • FormData это обычный браузерный API.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме