Envolvemos nossos campos de formulário em seus próprios componentes que contêm sua lógica de validação. Exemplo
UsernameInput.js
class UsernameInput extends Component {
render() {
return this.props.form.getFieldDecorator(this.props.id, {
rules: [...]
})(InputComponent);
}
}
E queremos usá-los em nossos formulários como este
// imports here
class CustomForm {
render() {
return (<Form>
<Form.Item>
<UsernameInput form={this.props.form} />
</Form.Item>
</Form>);
}
}
export default Form.create()(CustomForm);
Isso não funciona porque FormItem.getControls não detecta o componente como um controle. Apenas vê o wrapper como UsernameInput.
FormItem
para detectar UsernameInput
e funcionar como qualquer controle de entrada. Mostrar mensagens de erro, feedback, ajuda, etc.
FormItem
não encontra o controle dentro.
É difícil resolver esse problema. Você poderia postar seu conselho (como implementar) aqui se houver?
Resolvemos isso chamando o componente como uma função
CustomForm.js
// imports here
class CustomForm {
render() {
return (<Form>
<Form.Item>
{UsernameInput({ form: this.props.form })}
</Form.Item>
</Form>);
}
}
export default Form.create()(CustomForm);
Mas se você estiver aberto a ideias, acho que uma possível solução seria definir um contexto em FormItem
e os Input
podem se registrar quando estiverem presentes. Exemplo
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);
}
}
}
Vou tentar encontrar uma solução.
@gaastonsr você poderia mostrar todo o seu código sobre o UsernameInput com esta solução alternativa?
@gaastonsr Sua solução me ajuda muito!
Este é um problema válido? A sugestão de contexto parece boa para mim.
Corri para isso hoje em @gaastonsr é imo mais elegante do que exigir que todos os componentes do formulário verifiquem o contexto.
Olá @gaastonsr. Gostamos totalmente da sua proposta / feedback, bem-vindo para nos enviar Pull Request para isso. Por favor, envie sua Pull Request para o branch apropriado (feature branch for new feature, master for bugfix e outras mudanças), preencha o [Pull Request Template ] aqui, forneça o changelog / TypeScript / documentation / casos de teste se necessário e certifique-se de que o CI foi aprovado, iremos revisá-lo em breve. Agradeço antecipadamente e estamos aguardando sua contribuição!
Olá @gaastonsr, concordamos totalmente com sua sugestão / feedback, sinta-se à vontade neste warehouse para criar uma solicitação pull para resolver este problema. Envie o Pull Request para o branch correto (novos recursos para o branch de recursos, outros para o branch master), certifique-se de preencher o modelo predefinido no Pull Request e fornecer o changelog correspondente, definições de TypeScript, casos de teste, documentos, etc. necessários para as alterações , E para garantir que o CI seja aprovado, revisaremos o mais rápido possível, obrigado antecipadamente e aguardamos sua contribuição!
Verifique o novo componente do formulário no antd v4, o formulário v3 não será mantido em pouco tempo.
Comentários muito úteis
Resolvemos isso chamando o componente como uma função
CustomForm.js
Mas se você estiver aberto a ideias, acho que uma possível solução seria definir um contexto em
FormItem
e osInput
podem se registrar quando estiverem presentes. ExemploFormItem.js
Input.js