在Redux Forms中,如何根据另一个字段的值验证一个字段?

Dav*_*Sag 1 validation reactjs redux-form

我正在使用Redux Form版本6.4.3并且我正在尝试验证两个日期字段,以使'to'日期必须始终在'from'日期之前.

其他例子说我应该能够引用fields数组,props但是没有这样的数组.该form state有称为数组registeredFields但是但那些刚刚似乎是形式{name: 'dob', type: 'Field'}

这是我的表单代码

import React      from 'react'
import DatePicker from 'react-bootstrap-date-picker'
import moment     from 'moment'

import {Field, reduxForm} from 'redux-form'
import {Form, Row, Col, Button, FormGroup, ControlLabel, FormControl, HelpBlock} from 'react-bootstrap'

// validations
const required = value => !value ? 'This field is required' : undefined
const maxDate = max => value =>
  value && moment(value).isAfter(max) ? `Must be before ${max}` : undefined
const minDate = min => value =>
  value && moment(value).isBefore(min) ? `Must be after ${min}` : undefined

const renderDatepicker = ({ input, label, hint, showTodayButton, meta: { pristine, touched, warning, error } }) => {
  const validationState = pristine ? null : error ? 'error' : warning ? 'warning' : null
  return (
  <FormGroup validationState={validationState}>
    <Col componentClass={ControlLabel} sm={3}>{label}</Col>
    <Col sm={3}>
      <FormControl
        {...input}
        componentClass={DatePicker}
        placeholder="DD/MM/YYYY"
        dateFormat="DD/MM/YYYY"
        showTodayButton={showTodayButton}/>
    </Col>
    {pristine && !!hint && (
      <Col sm={6}>
        <HelpBlock>{hint}</HelpBlock>
      </Col>
    )}
    {touched && (
      (error && (
        <Col sm={6}>
          <HelpBlock>{error}</HelpBlock>
        </Col>)
      ) || (warning && (
        <Col sm={6}>
          <HelpBlock>{warning}</HelpBlock>
        </Col>
      ))
    )}
  </FormGroup>
)}

const MyForm = props => {
  const { error, handleSubmit, pristine, reset, submitting, fields } = props
  console.debug('fields', fields) // fields is undefined
  return (
    <Form horizontal>
      <Field
        name="dateFrom"
        component={renderDatepicker}
        label="Date from"
        hint="Earliest date for enquiry"
        validate={[required, maxDate('where do I get the other date value from?')]}
      />
      <Field
        name="dateTo"
        component={renderDatepicker}
        label="Date to"
        showTodayButton={true}
        hint="Latest date for enquiry"
        validate={[required, minDate('where do I get the other date value from?')]}
      />
    </Form>
  )
}

export default reduxForm({
  form: 'MyForm',
})(MyForm)
Run Code Online (Sandbox Code Playgroud)

我感觉到我遗漏了一些明显的东西,因为我所看到的所有例子都期望fields数组存在于props.

Y. *_*man 9

还值得一提的是,Field验证函数签名也是validate : (value, allValues, props) => error [optional]如此,您实际上也可以在字段级验证中引用其他字段值.

我相信你可以这样做:

const maxDateValidationAdapter = (value, values) => maxDate(values.dateTo)(value);
// Alternatively, if maxDate() is used only in this form you can just change its signature
<Field
    name="dateFrom"
    component={renderDatepicker}
    label="Date from"
    hint="Earliest date for enquiry"
    validate={[required, maxDateValidationAdapter]}
/>
Run Code Online (Sandbox Code Playgroud)

请参阅字段文档(您可以传递给Field => validate的道具).

  • 请记住,像这样传递验证器(作为内联函数)将导致在每个父组件上重新渲染“ Field”并重新注册,这可能会导致某些不良行为。可以在redux-form调度的动作中观察到它。 (2认同)