使用redux-form验证React中动态生成的表单并重新验证?

Rub*_*uby 7 reactjs redux redux-form react-redux

我正在使用“ revalidate”来验证“ redux-form”表单,但是我面对这种情况,其中存在一种基于我在其上映射并在表单内显示输入的API响应动态生成的表单。

这是我通常如何使用“重新验证...”验证“ redux表单”的示例

const validate = combineValidators({
    name: composeValidators(
        isRequired({ message: "Please enter your full name." }),
        hasLengthLessThan(255)({
            message: "Name can't exceed 255 characters."
        })
    )(),
    email: composeValidators(
        isRequired({ message: "Please enter your e-mail address." }),
        matchesPattern(IS_EMAIL)({
            message: "Please enter a valid e-mail address."
        })
    )()
});

export default compose(
    connect(
        null,
        actions
    ),
    reduxForm({ form: "signupForm", enableReinitialize: true, validate })
)(SignUpForm);
Run Code Online (Sandbox Code Playgroud)

现在,如何使用自动生成的表单执行类似的操作?

sti*_*ife 3

dynamicFields这个想法是从函数ownProps的第二个参数中获取validate,并根据需要使用它们来填充验证。

由于combineValidators它是一个高阶函数,因此在运行它之后,我们将其作为values参数调用结果函数。

// assuming dynamicFields an array like:
[
    {
        id: 1,
        name: 'age',
        component: 'input',
        label: 'Age',
        placeholder: 'Age'
    },
    {
        id: 2,
        name: 'size',
        component: 'input',
        label: 'Size',
        placeholder: 'Size'
    }
]
///////

const validate = (values, ownProps) => {
const staticValidations = {
    firstname: composeValidators(
        isRequired({ message: 'Please enter the first name.' }),
        hasLengthLessThan(255)({
            message: "Name can't exceed 255 characters."
        })
    )(),
    lastname: composeValidators(
        isRequired({ message: 'Please enter the lastname' }),
        matchesPattern('abc')({
            message: 'Please enter a valid lastname'
        })
    )()
}
const dynamicValidations = ownProps.dynamicFields.reduce((accu, curr) => {
    accu[curr.name] = isRequired({ message: 'Please enter ' + curr.name })
    return accu
}, {})

return combineValidators({
    ...staticValidations,
    ...dynamicValidations
})(values)
Run Code Online (Sandbox Code Playgroud)

}

在这个例子中,我只是把 ,isRequired但你可以更有创意,例如将 a 传递type给你的动态字段数据并做类似的事情if type === ABC then do XYZ

此处提供了完整的验证codesandbox - > https://codesandbox.io/embed/py5wqpjn40?fontsize=14