代码之家  ›  专栏  ›  技术社区  ›  VARAK

redux表单,如果使用返回的函数,验证将中断

  •  1
  • VARAK  · 技术社区  · 7 年前

    我正在使用redux表单,并希望执行自定义验证消息。

    我在这里使用了他们的示例验证项目: https://codesandbox.io/s/PNQYw1kVy

    照原样,它按预期工作。如果我将必填字段的验证函数从

    const required = value => value ? undefined : 'Required'

    const required = message => value => value ? undefined : message || 'Required'

    并更改名称和电子邮件的验证定义

    validate={[ required ]}

    validate={[ required('Message') ]} validate={[ required(null) ]}

    然后它不处理验证。

    为什么会发生这种情况?据我所知 const myFunc = val => val const myFunc2 = () => val => val 然后 [myFunc, myFunc2()] 将产生一个由两个功能相同的函数组成的数组。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Igor Alemasow    7 年前

    不要将验证函数包装到另一个函数中,每次呈现表单时,它都会构造一个新函数,这将导致字段重新呈现(因为 this.props.validate !== nextProps.validate )。(检查此项 issue on github )

    可以使用特定定义的参数化验证规则实例:

    const required = value => value ? undefined : 'Required';
    const requiredMessage = required('Message');
    
    <Field
        name="username"
        type="text"
        component={renderField}
        label="Username"
        validate={requiredMessage}
    />
    

    此外,这也是表单组件中定义的验证函数无法工作的原因。

    const FormComponent = (props) => {
        const {handleSubmit, submitting} = props;
        const required = value => value ? undefined : 'Required'; //this will not work!!!
    
        return <form onSubmit={handleSubmit}>
            <Field
                name='username'
                type='text'
                component={renderField}
                label='Username'
                validate={required}
            />
            <div>
                <button type="submit" disabled={submitting}>Submit</button>
            </div>
        </form>;
    };