Envolvemos nuestros campos de formulario en su propio componente que contiene su lógica de validación. Ejemplo
UsernameInput.js
class UsernameInput extends Component {
render() {
return this.props.form.getFieldDecorator(this.props.id, {
rules: [...]
})(InputComponent);
}
}
Y queremos usarlos en nuestros formularios como este
// imports here
class CustomForm {
render() {
return (<Form>
<Form.Item>
<UsernameInput form={this.props.form} />
</Form.Item>
</Form>);
}
}
export default Form.create()(CustomForm);
Esto no funciona porque FormItem.getControls no detecta el componente como control. Solo ve el contenedor como UsernameInput.
FormItem
para detectar UsernameInput
y trabajar como cualquier control de entrada. Muestra mensajes de error, comentarios, ayudas, etc.
FormItem
no encuentra el control dentro.
Es difícil resolver este problema. ¿Podría publicar su consejo (cómo implementarlo) aquí, si lo hubiera?
Resolvimos esto llamando al componente como una función
CustomForm.js
// imports here
class CustomForm {
render() {
return (<Form>
<Form.Item>
{UsernameInput({ form: this.props.form })}
</Form.Item>
</Form>);
}
}
export default Form.create()(CustomForm);
Pero si está abierto a ideas, creo que una posible solución sería definir un contexto en el FormItem
y el Input
pueden registrarse ellos mismos cuando esté presente. Ejemplo
FormItem.js
class FormItem extends Component {
static childContextTypes = {
registerControl: PropTypes.func
};
getChildContext() {
return { registerControl: this.registerControl };
}
registerControl(control) {
this.controls.push(control);
}
}
Input.js
class Input extends Component {
static contextTypes = {
registerControl: PropTypes.func
};
componentDidMount() {
if (this.context.registerControl) {
this.registerControl(this);
}
}
}
Intentaré encontrar una solución.
@gaastonsr, ¿ podría mostrar su código completo sobre UsernameInput con esta solución?
@gaastonsr ¡ Tu solución me ayuda mucho!
¿Sigue siendo un problema válido? La sugerencia de contexto me suena bien.
Me encontré con esto hoy en @gaastonsr es, en mi opinión, más elegante que requerir que todos los componentes del formulario verifiquen el contexto.
Hola @gaastonsr. Nos gusta mucho su propuesta / comentarios, bienvenido a enviarnos una solicitud de extracción. Envíe su solicitud de extracción a la rama adecuada (rama de función para nueva función, maestra para corrección de errores y otros cambios), complete la [Plantilla de solicitud de extracción ] aquí, proporcione el registro de cambios / TypeScript / documentación / casos de prueba si es necesario y asegúrese de que CI haya pasado, lo revisaremos pronto. ¡Apreciamos su avance y esperamos su contribución!
Hola @gaastonsr, estamos totalmente de acuerdo con tu sugerencia / comentario. Siéntete libre en este almacén para crear una solicitud de plantilla preestablecida en la solicitud de extracción y proporcione el registro de cambios correspondiente, las definiciones de TypeScript, los casos de prueba, los documentos, etc. necesarios para los cambios. Y para asegurarnos de que se apruebe el IC, lo revisaremos lo antes posible, ¡gracias de antemano y esperamos su contribución!
Compruebe el componente de formulario nuevo en antd v4, el formulario v3 no se mantendrá en poco tiempo.
Comentario más útil
Resolvimos esto llamando al componente como una función
CustomForm.js
Pero si está abierto a ideas, creo que una posible solución sería definir un contexto en el
FormItem
y elInput
pueden registrarse ellos mismos cuando esté presente. EjemploFormItem.js
Input.js