La función form.resetFields() de React Ant Design no llama al evento onChange de los .
Estoy utilizando un componente Ant Design <Form>
con <Form.Items>
que tienen eventos onChange. Si la función del evento onChange es verdadera, muestro contenido adicional.
Entonces, en el ejemplo de sandbox que creé, al cambiar todos los <Radio>
a Sí, se dispara el evento onChange que se valida y luego se muestra una div con el texto “Ha marcado todas las respuestas con sí”.
Como estoy utilizando <Form>
es un entorno controlado por formularios, así que estoy usando form
para establecer y restablecer los valores. Pero al llamar a form.resetFields()
, los manejadores onChange no se llaman. Entonces, el mensaje no desaparecerá ya que el estado no se actualiza. Por lo tanto, tengo que encontrar una manera de llamar a una función desde el componente padre que actualice los valores del formulario en el componente hijo.
Usar useImperativeHandle()
para cada campo para actualizar en formularios más complejos y llamar funciones desde el padre parece demasiado complejo para una tarea tan simple. Y agregar eventos personalizados para comunicarse con los componentes principales parece no ser una forma muy reactiva al leer este hilo de Overflow de Stack
¿Hay algo del formulario Ant Design que me esté perdiendo? Porque esto debe ser una tarea común. ¿Cuál es una buena manera de abordar este problema?
Enlace al código sandbox con un ejemplo:
Ejemplo:
// el mismo código de ejemplo proporcionado en inglés
davy.ai
Solución para actualizar el componente hijo al llamar
form.resetFields()
en Ant Design FormEn el ejemplo de código sandbox proporcionado, el componente
AntDFormChild
tiene eventosonChange
que se actualizan cuando el usuario selecciona una opción del componenteRadio.Group
. Mientras se usaform.resetFields()
, los eventosonChange
no se llaman y, por lo tanto, el estado no se actualiza como se esperaba.Una posible solución que se puede implementar sin usar
useImperativeHandle()
para comunicarse con el componente principal es agregar una propiedadkey
al componenteAntDFormChild
. El valor de la propiedadkey
se puede actualizar cada vez que se llaman las funcioneshandleResetForm()
ohandleFillForm()
. Esto creará esencialmente una nueva instancia del componenteAntDFormChild
y reestablecerá su estado como se esperaba.Aquí está el código actualizado con los cambios:
En esta solución, agregamos una variable de estado
isKeyUpdate
que se cambia cada vez que se llaman las funcioneshandleResetForm()
ohandleFillForm()
para actualizar la propiedadkey
del componenteAntDFormChild
. La propiedadkey
se establece en el valor actual deform.getFieldsValue()
, que es un objeto JSON de todos los valores de campo del formulario. Esto obligará a que se vuelva a renderizar el componenteAntDFormChild
con una nueva instancia y reinicie su estado.Esta es una forma simple y eficiente de actualizar el estado del componente hijo al restablecer el formulario en un entorno controlado usando el componente de Ant Design Form.