Redux表单 - 填充初始值

时间:2017-08-07 12:23:07

标签: javascript redux redux-form

我正在尝试使用初始数据填充表单但是我不确定此功能的语法以及它应该如何应用。最初我使用的表单是我也用来创建客户端的组件。我正在尝试将此表单重用为编辑客户端的表单。它有两个功能。

根据Redux中的建议,我将它作为一个组件,我也有一个容器。

现在,使用Chrome中的redux工具,我可以查看状态,并清楚操作已添加" editClient"输入数据所以我确实有数据。它被称为" editClient"在该州。

我的问题是我不知道如何使用它将这些状态值设置为初始值。我仔细查看了文档,但我对它的结构方式感到困惑。

以下是我的客户表单:

    import React, { PropTypes } from 'react'
    import { Field, reduxForm, FormSection } from 'redux-form'
    import { connect } from 'react-redux'
    import { Col, Row } from 'react-bootstrap'
    import { Button, Glyphicon, Panel } from 'react-bootstrap'
    import Moment from 'moment'
    import Address from '../../address/addressContainer'
    import FormField from '../../formComponents/formField'
    import CheckboxField from '../../formComponents/checkboxField'
    import TextField from '../../formComponents/textField'
    import StaticText from '../../formComponents/staticText'
    import TextAreaField from '../../formComponents/textAreaField'
    import DateField from '../../formComponents/datefield'

    import reducer from '../edit/reducer'

    export const CLIENT_FORM_NAME = 'Client'

    const required = value => (value ? undefined : 'Required')
    const maxLength = max => value =>
      value && value.length > max ? `Must be ${max} characters or less` : undefined
    const number = value =>
      value && isNaN(Number(value)) ? 'Must be a number' : undefined
    const minValue = min => value =>
      value && value < min ? `Must be at least ${min}` : undefined
    const email = value =>
      value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)
        ? 'Invalid email address'
        : undefined
    const tooOld = value =>
      value && value > 65 ? 'You might be too old for this' : undefined
    const aol = value =>
      value && /.+@aol\.com/.test(value)
        ? 'Really? You still use AOL for your email?'
        : undefined

    const normalizeMobilePhone = value => {
      if (!value) {
        return value
      }

      const onlyNums = value.replace(/[^\d]/g, '')
      if (onlyNums.length <= 4) {
        return onlyNums
      }
      if (onlyNums.length <= 8) {
        return `${onlyNums.slice(0, 4)} ${onlyNums.slice(4)}`
      }
      return `${onlyNums.slice(0, 4)} ${onlyNums.slice(4, 7)} ${onlyNums.slice(7, 10)}`
    }

    export const Client = (props) => {
      const { 
        handleSubmit,
        companyValue,
        isWarrantyCompanyValue,
        isEditMode } = props

      const { reset } = props

      return (
        <Row>
          <Col md={12}>
            <h2><Glyphicon glyph="edit" /> {isEditMode ? 'Edit' : 'New'} Client</h2>
            <hr />
            <form onSubmit={handleSubmit} className="form-horizontal">
              {isEditMode && (
                <Panel header={<h3>Client - Basic Details</h3>}>
                  <Row>
                    <Field component={StaticText}
                      name="clientNo"
                      id="clientNo"
                      label="Client No."
                      fieldCols={4}
                      labelCols={4}
                      controlCols={8}
                    />

                    <Field component={StaticText}
                      name="dateCreated"
                      id="dateCreated"
                      label="Date Created."
                      fieldCols={4}
                      labelCols={4}
                      controlCols={8}
                    />

                    <Field component={StaticText}
                      name="userName"
                      id="userName"
                      label="Created By."
                      fieldCols={4}
                      labelCols={4}
                      controlCols={8}
                    />
                  </Row>

                  <Row>
                    <Field
                      component={props => {
                        return (
                          <StaticText {...props}>
                            <p
                              className="form-control-static"
                            >
                              <Glyphicon glyph={props.input.value ? 'ok' : 'remove'} />
                              {' '}{props.input.value ? 'Has jobs attached' : 'No jobs attached'}
                            </p>
                          </StaticText>
                        )
                      }}
                      name="activity"
                      id="activity"
                      label="Activity"
                      fieldCols={4}
                      labelCols={4}
                      controlCols={8}
                    />

                    <Field component={CheckboxField}
                      name="active"
                      id="active"
                      label="De-Activate"
                      checkboxLabel="De activate this client"
                      fieldCols={4}
                      labelCols={4}
                      controlCols={8}
                    />
                  </Row>
                </Panel>
              )}

              <Panel header={<h3>Client - CompanyDetails</h3>}>

                <Row>
                  <Field component={CheckboxField}
                    id="company"
                    name="company"
                    label="Company?"
                    checkboxLabel="Client represents a company"
                    fieldCols={6}
                    labelCols={3}
                    controlCols={9}
                  />
                </Row>
                {companyValue && (
                  <div>
                    <Row>
                      <Field component={TextField}
                        name="companyName"
                        id="companyName"
                        type="text"
                        label="Company Name"
                        placeholder="Enter company name..."
                        fieldCols={6}
                        labelCols={3}
                        controlCols={9}
                      />

                      <Field component={TextField}
                        name="abn"
                        id="abn"
                        type="text"
                        label="ABN."
                        fieldCols={6}
                        labelCols={3}
                        controlCols={5}
                      />
                    </Row>
                    <Row>
                      <Field component={CheckboxField}
                        id="isWarrantyCompany"
                        name="isWarrantyCompany"
                        label="Warranty Company?"
                        checkboxLabel="Client represents a warranty company"
                        fieldCols={6}
                        labelCols={3}
                        controlCols={9}
                      />
                      {isWarrantyCompanyValue && (
                        <Field component={CheckboxField}
                          id="requiresPartsPayment"
                          name="requiresPartsPayment"
                          label="Requires Parts Payment?"
                          checkboxLabel="We pay for parts"
                          fieldCols={6}
                          labelCols={3}
                          controlCols={9}
                        />
                      )}
                    </Row>
                    <Row>
                      <Field component={TextField}
                        name="companyEmail"
                        id="companyEmail"
                        type="email"
                        label="Spare Parts Email."
                        placeholder="Enter spare parts email..."
                        fieldCols={6}
                        labelCols={3}
                        controlCols={9}
                      />
                    </Row>
                  </div>
                )}
              </Panel>

              <Panel header={<h3>Client - {companyValue ? 'Company Contact' : 'Personal'} Details</h3>}>

                <Row>
                  <Field component={TextField}
                    name="clientFirstName"
                    id="clientFirstName"
                    type="text"
                    label="First Name."
                    placeholder="Enter first name..."
                    fieldCols={6}
                    labelCols={3}
                    controlCols={9}
                    validate={[required]}
                  />

                  <Field component={TextField}
                    name="clientLastName"
                    id="clientLastName"
                    type="text"
                    label="Last Name."
                    placeholder="Enter last name..."
                    fieldCols={6}
                    labelCols={3}
                    controlCols={9}
                  />
                </Row>

                <Row>
                  <Field component={TextField}
                    name="mobilePhone"
                    id="mobilePhone"
                    type="text"
                    label="Mobile No."
                    placeholder="Enter mobile No..."
                    fieldCols={6}
                    labelCols={3}
                    controlCols={5}
                    normalize={normalizeMobilePhone}
                  />

                  <Field component={TextField}
                    name="phone"
                    id="phone"
                    type="text"
                    label="Phone No."
                    placeholder="Enter phone No..."
                    fieldCols={6}
                    labelCols={3}
                    controlCols={5}
                  />
                </Row>

                <Row>
                  <Field component={TextField}
                    name="email"
                    id="email"
                    type="email"
                    label="Email."
                    placeholder="Enter email address..."
                    fieldCols={6}
                    labelCols={3}
                    controlCols={9}
                  />
                </Row>
              </Panel>

              <FormSection name="Address">
                <Address />
              </FormSection>

              <Panel header={<h3>Notes</h3>}>
                <Row>
                  <Field component={TextAreaField}
                    id="notes"
                    name="notes"
                    label="Notes."
                    placeholder="Enter notes here..."
                    fieldCols={12}
                    labelCols={1}
                    controlCols={11}
                  />
                </Row>
              </Panel>

              <Panel header={<h3>Client - Bank Details</h3>}>
                <Row>
                  <Field component={TextField}
                    name="bankName"
                    id="bankName"
                    type="text"
                    label="Bank Name."
                    placeholder="Enter bank name..."
                    fieldCols={4}
                    labelCols={4}
                    controlCols={8}
                  />

                  <Field component={TextField}
                    name="bsb"
                    id="bsb"
                    type="text"
                    label="BSB No."
                    placeholder="Enter BSB No..."
                    fieldCols={4}
                    labelCols={4}
                    controlCols={8}
                  />


                  <Field component={TextField}
                    name="account"
                    id="account"
                    type="text"
                    label="Account No."
                    placeholder="Enter Account No..."
                    fieldCols={4}
                    labelCols={4}
                    controlCols={8}
                  />
                </Row>
              </Panel>

              <div className="panel-body">
                <Row>
                  <Col xs={4}>
                    <Row>
                      <Col xs={8} xsOffset={4}>
                        <Button bsStyle="primary" type="submit" bsSize="small">
                          <Glyphicon glyph="ok" /> Submit
                        </Button>
                        {' '}
                        <Button type="reset" bsSize="small" onClick={reset}>
                          <Glyphicon glyph="ban-circle" /> Clear
                        </Button>
                      </Col>
                    </Row>
                  </Col>
                </Row>
              </div>
            </form>
          </Col>
        </Row >
      )
    }

    let ClientForm = reduxForm({
      form: CLIENT_FORM_NAME,

    })(Client)

    ClientForm = connect(
      state => ({
        initialValues: state.editClient // pull initial values from client reducer
      }),
      { reducer } // bind client loading action creator
    )(Client)

    export default ClientForm

我根据redux表单示例在底部添加了以下内容:

    ClientForm = connect(
    state => ({
      initialValues: state.editClient // pull initial values from client reducer
    }),
    { reducer } // bind client loading action creator
  )(Client)

...当我保存它时,我收到以下错误。

  

异常:调用节点模块失败并显示错误:错误:字段必须位于使用reduxForm()

修饰的组件内

我相信我还没有理解如何设置初始值。

我哪里出错了,我需要做些什么才能使状态值加载并加载它们?

1 个答案:

答案 0 :(得分:1)

connect返回的函数的参数应为ClientForm而不是Client。试试这个:

ClientForm = connect(
  state => ({
    initialValues: state.editClient // pull initial values from client reducer
  }),
  { reducer } // bind client loading action creator
)(ClientForm)