Forma wykorzystania w React - "za jednym kliknięciem" [duplikat]

0

Pytanie

Używam hak useForm w react, i z jakiegoś powodu, gdy wpisuję wartości w formularz i kliknij przycisk wyślij, stan nie przyjmuje wartości, które wysłałem, a przyjmuje wartości puste.

Następnie, gdy wpisuję drugi zestaw wartości w formie i wysyłam go państwo przyjmuje wartość pierwszego występu.

Wydaje się, że zawsze jest "za jednym kliknięciem" (patrz konsoli.zaloguj się za pomocą funkcji RegisterAccount)

Związałem wysyłanie wewnątrz z funkcją RegisterAccount, który musi wykonać aktualizację stanu, w którym przechowywane są konta, przy pierwszym kliknięciu.

-Coś mi umknęło?

import {useForm} from 'react-hook-form'

const AddAccount = ()=> {

    const {register, handleSubmit, formState: { errors }} = useForm()
    
    const [items, setItems] = useState([])

    const registerAccount = (data)=> {
          setItems([...items, data]) 
          console.log(items)
    }

return(

<div>    

    <div className="grid grid-cols-1 justify-items-center">
        <h1 className="text-black font-bold py-2 text-2xl" >Agrega una cuenta</h1>
        <form onSubmit={handleSubmit(registerAccount)}>
            <table className="table-fixed">
                <thead>
                    <th className="w-1/2 "></th>
                    <th className="w-1/2 "></th>
                </thead>
                <tbody>
                    <tr>
                        <td><label className="py-1">Alias de la cuenta: </label></td>
                        <td><input defaultValue="" name="accountAlias" placeholder="Alias" 
                        className= "my-3 border-solid border-2 border-gray-900 py-1 px-3" 
                        {...register("accountAlias", {required: "Introduce el nombre de la cuenta"})}/>
                        <p className="text-red-500 text-sm">{errors.accountAlias?.message}</p>
                            </td>
                            
                    </tr>
                    <tr>
                        <td><label className="py-1">Tipo de cuenta: </label></td>
                        
                        <td><select name="accountType" className= "my-3 border-solid border-2 border-gray-900 py-1 px-3"
                        {...register("accountType", {required: "Selecciona el tipo de cuenta"})}>
                            <option value="">Selecciona...</option>
                            <option value="cuenta de gastos">Cuenta de gastos</option>
                            <option value="ahorro">Ahorro</option>
                            <option value="tarjeta de crédito">Tarjeta de crédito</option>
                            <option value="inversión">Inversión</option>
                            </select>
                            <p className="text-red-500 text-sm">{errors.accountType?.message}</p>
                            </td>
                    </tr>
                    <tr>
                        
                    </tr>
                </tbody>
            </table>

            <button className="bg-blue-500 text-white py-2 px-6 px-2 mt-4">Agregar</button>
        </form>
    </div>

</div>
)
}

export default AddAccount```
1

Najlepsza odpowiedź

0

problem w konsoli.log(). piszesz w dzienniku konsoli przed tym, jak twój stan będzie aktualizacja. ponieważ stan wykorzystania odbywa się asynchronicznie.

jeśli chcesz zobaczyć stan swoich elementów, trzeba użyć useEffect w następujący sposób.

   useEffect(() => {
        console.log(items)
    }, [items]);
2021-11-24 05:29:23

dobra, dziękuję!
Robtc83

W innych językach

Ta strona jest w innych językach

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