获取字段的对象以显示redux-form中的验证错误消息

时间:2016-10-10 20:14:53

标签: validation reactjs redux-form

我想进行同步验证,但我不知道如何获取字段的对象

validate.js

const validate = (values) => {
    const errors = {};

    if (!values.firstName) {
        errors.firstName = 'Firstname is required';
    } else if (values.firstName.length < 5 || values.firstName.length > 10) {
        errors.firstName = 'Firstname must be between 5 - 10';
    }
    return errors;
}

export default validate;

SimpleReduxForm.js

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { reduxForm, Field } from 'redux-form'
import validate from './validate'

const fields = [ 'firstName', 'lastName', 'age' ]

@reduxForm({
    form: 'simpleReduxForm',
    fields,
    validate
})
export default class SimpleReduxForm extends Component {
    render() {
        const { handleSubmit, invalid, pristine, submitting } = this.props
        const { fields } = this.props
        console.log(fields)
        return (
            <div>
                <form onSubmit={ handleSubmit(this.handleFormSubmit) }>

                    <Field name="firstName" component="input" type="text" />
                    <Field name="lastName" component="input" type="text" />
                    <Field name="age" component="input" type="number" />

                    <input type="submit" value="Submit" disabled={ pristine || invalid || submitting }/>
                </form>
            </div>
        )
    }
}

上面源代码console.log(fields)的输出

enter image description here

  

它只是一个数组而不是对象

我在文档中看到sample coding如下所示,但我不知道如何让我的工作

const { fields: { firstName, lastName } } = this.props

...
{ firstName.touched && firstName.error && <div>{ firstName.error }</div> }

请告知,谢谢

1 个答案:

答案 0 :(得分:3)

如何在redux-forms网站上执行此操作good example。要点是,您应该为Field呈现一个组件,然后该组件可以访问该输入的数据。例如,这是我的一个使用一些twitter-bootstrap错误样式。

const renderField = ({ input, label, type, meta: { touched, invalid, error } }) => (
  <div class={`form-group ${touched && invalid ? 'has-error' : ''}`}>
    <label>{label}</label>
    <input {...input} placeholder={label} type={type} className="form-control" />
    <div class="text-danger">
      {touched ? error: ''}
    </div>
  </div>
);

请注意,您只需提取touchedinvalid等代替object.property.touched等。

我在我的Field声明中使用了这个:

<Field name="name" type="text" component={renderField} label="Name" />