РЕАГИРУЙТЕ, форма отправки после предотвращения по умолчанию не работает, пока кнопка отправки не будет нажата во второй раз

#javascript #reactjs

Вопрос:

 import React , {useState } from "react"; import Button from 'react-bootstrap/Button'; import Form from "react-bootstrap/Form" import 'bootstrap/dist/css/bootstrap.min.css'; import {push,ref} from "firebase/database"; import db from "./firebase";   function App() {  const [age, setAge] = useState("");  const [hes, setHes] = useState("");  const [visa, setVisa] = useState("");  const [islem , setIslem] = useState("");    const handleSubmit = (event) =gt;{  event.preventDefault();  setAge(event.target[0].value);  setHes(event.target[1].value);  setVisa(event.target[2].value);  push(ref(db,"info"),{  age: age,  hes: hes,  visa : visa,  islem : islem  })  }  return (  lt;divgt;  lt;Form onSubmit={  handleSubmit  }gt;  lt;Form.Group className="mb-3 mx-3" gt;  lt;Form.Labelgt;AGElt;/Form.Labelgt;  lt;Form.Control name="age" type="text" placeholder="AGE: " /gt;  lt;/Form.Groupgt;  lt;Form.Group className="mb-3 mx-3" gt;  lt;Form.Labelgt;HESlt;/Form.Labelgt;  lt;Form.Control name="hes" type="text" placeholder="Hes CODE: " /gt;    lt;/Form.Groupgt;  lt;Form.Group className="mb-3 mx-3" gt;  lt;Form.Labelgt;VISAlt;/Form.Labelgt;  lt;Form.Control name="visa" type="text" placeholder="Visa: " /gt;  lt;/Form.Groupgt;    lt;div className="d-grid gap-2"gt;  lt;Button onClick = {() =gt;{  setIslem("NC")  }}variant="secondary" type="submit" size="lg"gt;  New Customer  lt;/Buttongt;  lt;Button onClick = {() =gt;{    setIslem("NCC");  }}variant="secondary" type="submit" size="lg"gt;  New Cards  lt;/Buttongt;  lt;Button onClick = {() =gt;{    setIslem("FI");  }}variant="secondary" type="submit" size="lg"gt;  For information  lt;/Buttongt;  lt;Button onClick = {() =gt;{    setIslem("WDM");  }}variant="secondary" type="submit" size="lg"gt;  Withdraw / Deposit Money  lt;/Buttongt;  lt;Button onClick = {() =gt;{    setIslem("IO");  }}variant="secondary" type="submit" size="lg"gt;  Insurance Operations  lt;/Buttongt;  lt;Button onClick = {() =gt;{    setIslem("RO");  }}variant="secondary" type="submit" size="lg"gt;  Retirement Operations  lt;/Buttongt;  lt;Button onClick = {(e) =gt;{  setIslem("PT")   }}variant="secondary" type="submit" size="lg"gt;  Paying Fines / Taxes / Debt  lt;/Buttongt;  lt;Button onClick = {() =gt;{    setIslem("SME");  }}variant="secondary" type="submit" size="lg"gt;  SME Operations  lt;/Buttongt;  lt;Button onClick = {() =gt;{    setIslem("INO");  }}variant="secondary" type="submit" size="lg"gt;  Investment Operations  lt;/Buttongt;  lt;Button onClick = {() =gt;{    setIslem("MM");  }}variant="secondary" type="submit" size="lg"gt;  Money Management  lt;/Buttongt;  lt;/divgt;    lt;/Formgt;    lt;/divgt;    ); }  export default App;  

Это мой код, база данных, записывающая данные только после 2-й отправки, и она записывает старые данные. Я хочу записать данные в первом представлении. Например: в первом представлении мои данные : возраст = 15 лет, во втором представлении мои данные : возраст = 16 лет,

В базе данных это написано так: [возраст = «» , возраст = «15»]. Он всегда идет на 1 шаг позади. Как я могу это решить?

Ответ №1:

Было бы лучше, если бы вы обновили состояния во время изменения, а не во время отправки, в любом случае, чтобы устранить возникшую у вас проблему, я предлагаю вам отправить параметры формы вместо состояний, так как React не изменит их значение до следующего рендеринга.

 const handleSubmit = (event) =gt;{  event.preventDefault();  setAge(event.target[0].value);  setHes(event.target[1].value);  setVisa(event.target[2].value);  push(ref(db,"info"),{  age: event.target[0].value,  hes: event.target[1].value,  visa : event.target[2].value,  islem : islem  })  }  

В этом случае, однако, переменные состояния (setAge, setHes, setVisa), я бы сказал, не нужны