Идея состоит в том, чтобы получить 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)
}
В этом примере я просто добавляю isRequired
, но вы можете быть более креативным, например. передача type
в данные динамического поля и выполнение таких операций, как if type === ABC then do XYZ
Полные коды и окно подтверждения приведены здесь -> https://codesandbox.io/embed/py5wqpjn40?fontsize=14