【问题标题】:Validate dynamically generated form in react using redux-form and revalidate?使用redux-form验证动态生成的表单并重新验证?
【发布时间】:2019-08-07 09:37:03
【问题描述】:

我正在使用“重新验证”来验证“redux-form”表单,但我正面临这种情况,其中有一个表单是根据我映射到它的 API 响应动态生成的,并在其中显示输入表格。

这是我通常如何使用“revalidate ...”验证“redux forms”的示例

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);

现在,我如何使用自动生成的表单做类似的事情?

【问题讨论】:

  • validate函数的第二个参数是组件props。也许您可以在那里找到您的动态字段并相应地建立验证?
  • @stilllife 你能举例说明你的意思吗?

标签: reactjs redux react-redux redux-form


【解决方案1】:

我们的想法是从ownProps 中获取dynamicFields,这是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

【讨论】:

  • 这似乎合乎逻辑,我认为它应该可以工作,我稍后会尝试,谢谢,伙计。
  • 第一个问题,组件渲染时的“ownProps”不可用,直到在ComponentDidMount中对API的请求完成后才可用,如何在请求完成后获取“ownProps”?
  • 道具始终存在,但您的数据稍后会出现。当您将 API 结果存储在 redux 中时,您可以使用 react-redux connect with mapStateToProps 来使它们可用,就像我在代码沙箱中所做的那样。这会导致组件重新渲染,因此此时验证将是正确的。如果'dynamicFields'在第一次渲染时未定义,只需调整验证以不使用.reduce,而是只返回静态的(忽略动态的)
  • 这就是我的意思,请看一下我在修改代码后所做的示例... codesandbox.io/s/jn1956zy1w 当我尝试控制台记录“dynamicValidations”时,您会发现它给了我一个空对象,验证不起作用。非常感谢您对此提供的帮助。
  • 正如您在我制作的示例中看到的那样,我使用“jsonplaceholder”作为示例,我只是渲染动态输入,我删除了静态输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多