Tengo useState "setAnswers" (establecer) y "respuestas" (obtener) (las respuestas son una matriz con cadenas)
y haga clic en desencadenar:
onClick = () => { setAnswers((prev) => [...prev, e]) setValue(questionKey, answers) console.log(watch(questionKey)) }pero con cada clic solo obtuve el valor anterior
De hecho, su console.log se ejecuta antes de que el estado termine de calcularse, si coloca su console.log en otro lugar, normalmente, encontrará lo que desea.
Pruébalo y dime
Tu console.log(watch(questionKey)) todo el tiempo saldrá mal en onChange .
necesita usar un useEffect para iniciar sesión o hacer cualquier otra cosa con el estado como base.
useEffect(() => { console.log(watch(questionKey) }, [questionKey]);para obtener más información, puede leer aquí: https://dev.to/mpodlasin/react-useeffect-hook-explained-in-depth-on-a-simple-example-19ec
Creo que está un poco confundido: la función de watch de useForm se usa para
Observe las entradas especificadas y devuelva sus valores.
Entonces console.log(watch(questionKey)) no tiene sentido.
watch debe usarse de esta manera:
React.useEffect(() => { const subscription = watch((value, { name, type }) => console.log(value, name, type)); return () => subscription.unsubscribe(); }, [watch]); Utiliza un useEffect para suscribirse/cancelar la suscripción al reloj en algunos campos de formulario, y luego en el cuerpo del componente podría llamar:
const watchSomething = watch(<something>); y, cada vez que el campo llamado <something> cambie su valor, el watch ejecutará console.log(value, name, type) .
Si desea imprimir el último valor de una variable de estado, debe saber que setValue, setAnswer son funciones asíncronas y no se garantiza en absoluto que en la siguiente línea pueda registrar el último valor. Para solucionar tu problema tienes 2 opciones:
use el watch correctamente;
olvídate de watch y usa el clásico useEffect :
onClick = () => { setAnswers((prev) => [...prev, e]) setValue(questionKey, answers) } useEffect(() => { console.log(questionKey); //<-- here you will print the very last value of questionKey }, [questionKey]); Aquí una guía sobre cómo usar el watch .