Javascript 反应Formik:setFieldError和onBlur未按预期工作
我有一个电子邮件输入。在输入的onBlur事件中,我检查DB是否存在电子邮件 如果电子邮件存在,我调用setFieldError将该字段标记为无效(类Javascript 反应Formik:setFieldError和onBlur未按预期工作,javascript,reactjs,forms,validation,formik,Javascript,Reactjs,Forms,Validation,Formik,我有一个电子邮件输入。在输入的onBlur事件中,我检查DB是否存在电子邮件 如果电子邮件存在,我调用setFieldError将该字段标记为无效(类无效已设置) 到目前为止,一切都很好 但是,当我单击另一个字段或屏幕的另一部分时,无效类被删除,而有效类再次出现 显然,我需要类无效存在,直到在电子邮件字段中输入另一个文本。 我的字段组件(只是一个带有一些基本逻辑的输入,如果需要,我将在下面编写实现): 字段组件: const Field = props => { const {
无效
已设置)
到目前为止,一切都很好
但是,当我单击另一个字段或屏幕的另一部分时,无效
类被删除,而有效
类再次出现
显然,我需要类无效
存在,直到在电子邮件字段中输入另一个文本。
我的字段组件(只是一个带有一些基本逻辑的输入,如果需要,我将在下面编写实现):
字段组件:
const Field = props => {
const {
name,
label,
component,
required,
autocol,
inputSize,
size,
hasLabel,
emptyLabel,
formText,
formTextOnHover,
noMargin,
hidden,
} = props;
return (
<React.Fragment>
<FormGroup
className={classNames({
col: autocol,
[`col-sm-${size.sm}`]: size.sm,
[`col-md-${size.md}`]: size.md,
[`col-lg-${size.lg}`]: size.lg,
[`col-xl-${size.xl}`]: size.xl,
'has-form-text': formTextOnHover,
'mb-0': noMargin,
'd-none': hidden,
})}
>
{!hasLabel ? (
''
) : (
<Label
for={name}
className={classNames({
required,
})}
>
{label}
</Label>
)}
{emptyLabel ? <Label className="d-block"> </Label> : ''}
{React.createElement(component, {
...props,
size: inputSize,
})}
{formText ? <small className="form-text">{formText}</small> : ''}
</FormGroup>
</React.Fragment>
);
};
Field.defaultProps = {
label: '',
required: true,
inputSize: Sizes.REGULAR,
autocol: true,
size: {
sm: 0,
md: 0,
lg: 0,
xl: 0,
},
hasLabel: true,
emptyLabel: false,
formText: '',
formTextOnHover: false,
noMargin: false,
hidden: false,
};
Field.propTypes = {
label: PropTypes.string,
name: PropTypes.string.isRequired,
component: PropTypes.func.isRequired,
required: PropTypes.bool,
inputSize: PropTypes.oneOf([Sizes.SMALL, Sizes.REGULAR, Sizes.LARGE]),
autocol: PropTypes.bool,
size: PropTypes.shape({
sm: PropTypes.number,
md: PropTypes.number,
lg: PropTypes.number,
xl: PropTypes.number,
}),
hasLabel: PropTypes.bool,
emptyLabel: PropTypes.bool,
formText: PropTypes.string,
formTextOnHover: PropTypes.bool,
noMargin: PropTypes.bool,
hidden: PropTypes.bool,
};
export default Field;
const Field=props=>{
常数{
名称
标签,
组成部分,
必修的,
自动编码,
输入大小,
大小,
hasLabel,
空标签,
formText,
formTextOnHover,
诺马金,
隐藏的,
}=道具;
返回(
{!有标签吗(
''
) : (
{label}
)}
{emptyLabel?:''}
{React.createElement(组件{
…道具,
大小:输入大小,
})}
{formText?{formText}:''}
);
};
Field.defaultProps={
标签:“”,
要求:正确,
inputSize:Sizes.REGULAR,
自动通信:是的,
尺寸:{
sm:0,
md:0,
lg:0,
xl:0,
},
hasLabel:是的,
emptyLabel:false,
formText:“”,
formTextOnHover:false,
诺玛金:错,
隐藏:假,
};
Field.propTypes={
标签:PropTypes.string,
名称:PropTypes.string.isRequired,
组件:PropTypes.func.isRequired,
必需:PropTypes.bool,
inputSize:PropTypes.one([size.SMALL,size.REGULAR,size.LARGE]),
autocol:PropTypes.bool,
大小:PropTypes.shape({
sm:PropTypes.number,
md:PropTypes.number,
lg:PropTypes.number,
xl:PropTypes.number,
}),
hasLabel:PropTypes.bool,
emptyLabel:PropTypes.bool,
formText:PropTypes.string,
formTextOnHover:PropTypes.bool,
noMargin:PropTypes.bool,
隐藏:PropTypes.bool,
};
导出默认字段;
我做错了什么
handleEmail = (propertyName, value) => {
const { setFieldError } = this.props;
if (!value) {
return;
}
Meteor.call('user.findByEmail', value, (error, user) => {
if (user) {
setFieldError(propertyName, 'Email is in use');
}
},
)};
const Field = props => {
const {
name,
label,
component,
required,
autocol,
inputSize,
size,
hasLabel,
emptyLabel,
formText,
formTextOnHover,
noMargin,
hidden,
} = props;
return (
<React.Fragment>
<FormGroup
className={classNames({
col: autocol,
[`col-sm-${size.sm}`]: size.sm,
[`col-md-${size.md}`]: size.md,
[`col-lg-${size.lg}`]: size.lg,
[`col-xl-${size.xl}`]: size.xl,
'has-form-text': formTextOnHover,
'mb-0': noMargin,
'd-none': hidden,
})}
>
{!hasLabel ? (
''
) : (
<Label
for={name}
className={classNames({
required,
})}
>
{label}
</Label>
)}
{emptyLabel ? <Label className="d-block"> </Label> : ''}
{React.createElement(component, {
...props,
size: inputSize,
})}
{formText ? <small className="form-text">{formText}</small> : ''}
</FormGroup>
</React.Fragment>
);
};
Field.defaultProps = {
label: '',
required: true,
inputSize: Sizes.REGULAR,
autocol: true,
size: {
sm: 0,
md: 0,
lg: 0,
xl: 0,
},
hasLabel: true,
emptyLabel: false,
formText: '',
formTextOnHover: false,
noMargin: false,
hidden: false,
};
Field.propTypes = {
label: PropTypes.string,
name: PropTypes.string.isRequired,
component: PropTypes.func.isRequired,
required: PropTypes.bool,
inputSize: PropTypes.oneOf([Sizes.SMALL, Sizes.REGULAR, Sizes.LARGE]),
autocol: PropTypes.bool,
size: PropTypes.shape({
sm: PropTypes.number,
md: PropTypes.number,
lg: PropTypes.number,
xl: PropTypes.number,
}),
hasLabel: PropTypes.bool,
emptyLabel: PropTypes.bool,
formText: PropTypes.string,
formTextOnHover: PropTypes.bool,
noMargin: PropTypes.bool,
hidden: PropTypes.bool,
};
export default Field;