Redux-Form使用“客户端”表单同时创建和编辑

时间:2017-08-12 04:51:45

标签: javascript redux redux-form

还是新手。

有人建议我可以使用客户端表单进行创建和编辑。我随后对Create和Edit使用了相同的表单,但是当我重新加载页面时,我现在遇到了没有离开表单字段的初始值的问题,因为我在表单的底部添加了与initialvalues的连接。

以下是我为redux表单设置表单的方法:

  let ClientForm = reduxForm({
    form: CLIENT_FORM_NAME
  })(Client);

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

export default ClientForm2;

状态随着editClient的更新而变化,并确保表单字段使用来自状态的相关数据加载。细

但是,如果我这次重新加载表单作为创建或“新客户”形式的原始详细信息形式,编辑客户端仍然在字段中。

当状态中的isEditMode设置为false时,如何构造表单以不加载editClient细节(避免加载)initialValues?

这是使用表单进行决斗还是更多目的的常见问题,是否有简单/优雅的解决方法?

对于附加的上下文,这里是整个表格..它很长,所以我最后附上了它..

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

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

export default ClientForm2;

0 个答案:

没有答案