Как получить значения fetcher.Form в ремиксе

Я использую useFetcher() для создания формы через <fetcher.Form>. У меня есть несколько полей ввода в форме, но я не хочу, чтобы форма отправлялась, когда пользователь нажимает клавишу ввода. Для этого при отправке формы у меня есть обработчик формы, который вызывает e.preventDefault(). Я хочу, чтобы форма была отправлена ​​с помощью явного действия пользователя (нажатия кнопки «Сохранить». Я предполагал, что для отправки формы вручную я вызову метод fetcher.submit(), но для этого мне нужны значения форм, но сборщик Хук, похоже, не обеспечивает способа их получения. Я не могу придумать простой способ заставить значения форм выполнять отправку без создания контролируемых полей ввода, что сводит на нет всю цель использования <fetcher.Form>. Это решение просто создайте целую форму с контролируемыми входами или я что-то упускаю?

const fetcher = useFetcher():

function submitHandler(e: FormEvent) {
    e.preventDefault();
}

function realSubmit(){
    // let formData = fetcher.data;
    let formData = ""; // how do I get the form data??

    fetcher.submit(formData, fetcher.formAction);
}

return(
    <fetcher.Form action = "/some/route" onSubmit = {submitHandler} method = "post">
        <input name = "input1" type = "text"/>
        <input name = "input2" type = "text"/>
        <input name = "input3" type = "text"/>
     
        <button type = "submit" onClick = {realSubmit}>Save</button>
    </fetcher.Form>
);

Любая помощь будет принята с благодарностью!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самое простое — создать форму ref. Затем вы можете создать объект FormData по ссылке и отправить его.

export default function Index() {
  const fetcher = useFetcher();
  const formRef = useRef<HTMLFormElement>(null);
  function submitHandler(e: FormEvent) {
    e.preventDefault();
  }

  function realSubmit() {    
    const formData = new FormData(formRef.current!);
    // modify formData here
    formData.set("message", "hello world")
    fetcher.submit(formData);
  }

  return (
    <fetcher.Form ref = {formRef} onSubmit = {submitHandler} method = "post">
      <input name = "input1" type = "text" />
      <input name = "input2" type = "text" />
      <input name = "input3" type = "text" />

      <button type = "submit" onClick = {realSubmit}>
        Save
      </button>
    </fetcher.Form>
  );
}

Обновлено: Другой вариант — сохранить обычный обработчик отправки.

export default function Index() {
  const fetcher = useFetcher();

  function submitHandler(e: FormEvent) {
    // get formData from currentTarget (form)
    const formData = new FormData(e.currentTarget);

    // modify formData here
    formData.set("message", "hello world")

    // submit formData using fetcher
    fetcher.submit(formData);

    // prevent default form submit
    e.preventDefault();
  }

  return (
    <fetcher.Form onSubmit = {submitHandler} method = "post">
      <input name = "input1" type = "text" />
      <input name = "input2" type = "text" />
      <input name = "input3" type = "text" />

      <button type = "submit">
        Save
      </button>
    </fetcher.Form>
  );
}

ты спасатель! Кстати, вы помогли мне своими ответами и на другие посты. Я решаю тебя!

SocaBlood 28.09.2023 01:06

Я обновил свой ответ альтернативным ответом... в любом случае, рад, что смог помочь.

Kiliman 28.09.2023 01:21

В вашем первом примере я заметил, что он все равно отправляется, если кнопка находится внутри тела формы. Когда я перемещаю его за пределы тела формы, он работает так, как ожидалось. Я думаю, это потому, что вызываются методы submitHandler и realSubmit. Это не проблема, потому что я хочу, чтобы кнопка отправки находилась за пределами формы, но такое поведение для меня не было очевидным.

SocaBlood 29.09.2023 15:34

Другие вопросы по теме