Nie udało się przekazać wartość z danych wejściowych w dane w reactjs

0

Pytanie

Mam formularz, wykorzystująca react-hook-form i aktualizować formularza do wprowadzania danych za pomocą setState, ale kiedy dostaję formData i złóż zapytanie na wyjmowanie, wartość z pola wprowadzania w ogóle nie ładuje.

To obraz, kiedy aktualizować pole tekstowe z setState i złóż zapytanie na wyjmowanie enter image description here

To obraz, kiedy aktualizować pole wpisywania tekstu z klawiatury i wykonuję zapytanie na wyjmowanie enter image description here

const FirstProject = () => {
  const [solutestate, setSoluteState] = useState("");
  const [solventstate, setSolventState] = useState("");
  const [fetchData, setFetchData] = useState("");
  const [Error, setError] = useState(null);

  const { register, handleSubmit, control } = useForm({
    defaultValues: {
      solute: "",
      solvent: "",
    },
  });

  const formData = new FormData();
  const onSubmit = (data) => {
    formData.set("solute", data.solute);
    formData.set("solvent", data.solvent);

    fetch("https://flask-api-test1.herokuapp.com/predict", {
      method: "post",
      body: formData,
    })
      .then((res) => res.json())
      .then((result) => {
        setFetchData(result.result.predictions);
        //console.log(result.result.predictions);
        //console.log(Object.entries(result));
        // setIsPending(false);
      })
      .catch((err) => {
        console.log(data);
        setError(err.error);
        console.log(err);
      });
  };

<form onSubmit={handleSubmit(onSubmit)}>
 <input
  {...register("solute")}
  placeholder="First Name"
  onChange={(e) => setSoluteState(e.target.value)}
  value={solutestate}
 />
 <input
  {...register("solvent")}
  placeholder="First Name"
  onChange={(e) => setSolventState(e.target.value)}
  value={solventstate}
 />
 <input type="submit" />
 </form>

fetch forms javascript react-hook-form
2021-11-22 17:32:54
1

Najlepsza odpowiedź

1

Tak, masz kilka problemów, które widzę teraz w kodzie.Stan był taki sam dla onchange event dla obu a solvent i solute oto dlaczego oni nadal korzystać z tego samego stanu. Trzeba było użyć innego utworzony hak. 2 - mam problem, z którym masz do czynienia, polegała na tym, że wysłałeś zmienną FormData zamiast danych (argument podany przez funkcje). Dane formularza cały czas były puste zmiennej. Oto poprawna wersja.

Poprawiono poniżej: https://codesandbox.io/s/quirky-tdd-0zs4c?file=/src/App.js


//per the documents handle submit also gives you the Event Object*

handleSubmit: 
((data: Object, e?: Event) => void, (errors: Object, e?: Event) => void) => Function

W ten sposób twój kod musi otrzymywać dane wejściowe z state/event obiekt on changei gdy użytkownik wysyła, uruchamia logikę do sprawdzania i wysyłania.

import Editortwo from "./components/Editortwo";
import "./styles.css";
import { useState } from "react";
import { useForm } from "react-hook-form";

export default function App() {
  const [solutestate, setSoluteState] = useState();
  const [solventstate, setSolventState] = useState();

  const [fetchData, setFetchData] = useState("");
  const [Error, setError] = useState(null);

  const { register, handleSubmit } = useForm({
    defaultValues: {
      solute: "",
      solvent: ""
    }
  });

  const onSubmit = async data => {
    let res;
    console.log(" Post Data To send to API", data);
    try {
      res = await fetch("https://flask-api-test1.herokuapp.com/predict", {
        method: "post",
        //this was formData which was blank
        body: JSON.stringify(data)
      });
    } catch (err) {
      res = err;
      setError(err);
      console.log(err);
    }

    if (!res) {
      console.warn("Invalid Response", res.status);
      throw Error("No API Response");
    }

    const json = await res.json();
    console.log("Results from Request", json);
    if (json.result) {
      setFetchData(json.result.predictions);
    }
  };
  return (
    <div className="App">
      <Editor {...{ setSoluteState }} />
      <Editortwo {...{ setSolventState }} />
      <form noValidate onSubmit={handleSubmit(onSubmit)} className="space-x-4">
        <input
          className="shadow appearance-none border rounded  py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
          {...register("solute")}
          placeholder="SOLUTE"
          onChange={(e) => setSoluteState(e.target.value)}
          value={solutestate}
        />
        <input
          className="shadow appearance-none border rounded  py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
          {...register("solvent")}
          placeholder="SOLVENT"
          onChange={(e) => setSolventState(e.target.value)}
          value={solventstate}
        />
        <input
          className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline"
          type="submit"
        />
        <input
          className="shadow appearance-none border rounded  py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
          type="text"
          readOnly
          value={fetchData}
          name="OUTPUT"
        />
      </form>
    </div>
  );
}

2021-11-23 20:17:07

Teraz otrzymuję ten błąd Line 47:19: 'err' is not defined no-undef Line 48:16: 'err' is not defined no-undef Line 310:60: 'e' is not defined no-undef
harsh

Pojawia się błąd "e", która nie jest zdefiniowana w onSubmit także @Josh
harsh

o, usuń zdarzenie w obsłudze wysyłki. zapewnia go automatycznie, zgodnie z dokumentami. Chciałem tylko pokazać, w przypadku, gdy wysyłano, jak zapobiec aktualizacja tej strony i utratę danych. Także, jeśli masz ten kod w codesandbox, spróbuj i podziel się nim.
Josh

Błędy wyeliminowane, ale kod działa tak samo, jak wcześniej. za każdym razem, gdy pola wprowadzania danych są aktualizowane z wykorzystaniem stanu. gdy wciskam "Wyślij", dane reprezentują sobą pustą tablicę, ale jeśli przytyję, czy to skopiuję włożenie do pola wprowadzania, to będzie działać dobrze.
harsh

po prostu pojawi się zmiana stanu wartości pól wprowadzania. ale nie znajduje odzwierciedlenie w danych, gdy wykonuję żądanie postu
harsh

@surowo, jeśli włożysz go na repl.it lub codesandbox, chciałbym spojrzeć na niego dla ciebie. Na życzenie na wyjmowanie należy podjąć state dane i sprawdź/sprawdź, a następnie prześlij je do API. jeśli to jest to, co chcesz zrobić. Kiedy wykonujesz wysyłanie, trzeba uniemożliwić korzystanie domyślnie, jeśli twoje wartości znikają.
Josh

codesandbox.io/s/hidden-pond-ojqk0?file=/src/App.js To jest link do codesandbox. Stan jest aktualizowany z dwóch edytorów. narysuj molekułę, i cząsteczkowa formuła zostanie wykazana w polu wpisywania tekstu, po kliknięciu wyślij, dostaniesz ruchomy punkt.
harsh

Problem w tym, że stan jest wyświetlany w polu tekstowym wpisać, ale nie jest ona wyświetlana w danych, gdy wykonuję zapytanie na wyjmowanie. ale kiedy ja tylko kopiuję i wklejam to samo w pole tekstowe, to działa
harsh

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................