如何在redux表单中使用不同的名称ID多次渲染相同的字段时验证字段

Posted

技术标签:

【中文标题】如何在redux表单中使用不同的名称ID多次渲染相同的字段时验证字段【英文标题】:How to validate field when rendering same field multiple time with different name id in redux form 【发布时间】:2018-09-08 08:42:02 【问题描述】:

这里我遇到了验证问题,我想渲染 5 个项目的列表,列表中的所有字段都相同,下面是代码

ListData = () => 
    let a = [];
    for (var i = 0; i < 5; i++) 
        a.push(<ListItemView value=i key=i />); // Component
    
    return a;
;


render() 
    return (
     <div>
       <List>this.ListData()</List> // List of 5 items
       <Button disabled=this.props.disabledSubmission 
        color="primary"type="submit">
        Invite Members
       </Button>
    )

字段组件

 const ListItemView = ( value ) => 
   return (
    <ListItem>

        <div className="col-12 w-100">
            <div className="row">
                <div className="col-lg-4 col-sm-5 col-12">
                    <Field
                        name=`$value-name`       // 0-name
                        component=renderTextField
                        label="Name"
                        className="mt-1"
                        fullWidth
                        margin="normal"

                    />
                </div>
                <div className="col-lg-5 col-sm-5 col-12">
                    <Field
                        name=`$value-email`     // 0-email
                        component=renderTextField
                        label="Email"
                        className="mt-1"
                        fullWidth
                        margin="normal"
                        type="email"
                    />
                </div>
            </div>
        </div>
    </ListItem>
    );
 ;

问题是,当我尝试使用 redux 表单进行验证时,我很困惑如何使用它的名称验证每个字段 - 0-name,0-email,等等...

那么,我如何通过循环或其他方式检查它,从而使每个字段的验证工作都静态地编写类似这样的内容

 const validation = (values) => 
  const errors = ;
  if(!values[`0-name`]) 
    errors.values[`0-name`] = 'Required'
   else if(!values[`0-email`]) 
    errors.values[`0-email`] = 'Required'
   
  if(!values[`1-name`]) 
    errors.values[`1-name`] = 'Required'
   ... // and many more...

   return errors;
 ;

【问题讨论】:

【参考方案1】:

理想情况下,您应该有两个单独的纯函数,一个用于验证名称,一个用于验证电子邮件。如下所示。

<Field
                    name=`$value-name`       // 0-name
                    component=renderTextField
                    label="Name"
                    className="mt-1"
                    fullWidth
                    margin="normal"
                    validate=validateName

                />
            </div>
            <div className="col-lg-5 col-sm-5 col-12">
                <Field
                    name=`$value-email`     // 0-email
                    component=renderTextField
                    label="Email"
                    className="mt-1"
                    fullWidth
                    margin="normal"
                    type="email"
                    validate=validateEmail
                />

但是,如果你想要唯一的功能来完成这项工作

const validate = (value, allValues, props, name) => 
if(name.includes('email')&& notEmail(value))
return 'invalid email'

if(name.includes('name')&& notName(value))
return 'invalid Name' 



return undefiend;


【讨论】:

以上是关于如何在redux表单中使用不同的名称ID多次渲染相同的字段时验证字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在页面上多次嵌入相同的 redux-form?

ReactJS表单应用程序:如何阻止父组件重新渲染? /使用redux共享状态的正确方法

Django表单在单个HTML中多次使用,避免重复的id

React Redux 表单(多种表单) - 路由和状态处理问题

为啥 componentDidMount 在 react.js 和 redux 中被多次调用?

Redux-Toolkit 和 React Hooks - 存储更改不会触发重新渲染