使用redux表单时,该值未显示在字段中

时间:2018-07-03 05:51:09

标签: javascript reactjs redux redux-form

我正在为表单使用redux-form。表单已提交,但页面已刷新 我需要显示来自服务器的提交数据。一切正常 本地状态也会从getDerivedStateFromProps更新,但该字段不会 与数据一起显示。我使用了普通输入标签,它显示了数据。我错过了什么?

这就是我所做的

更新

  const mapStateToProps = (state) => {
  const { company } = state.profile.companyReducer;
  return {
    getCompany: state.profile.companyReducer,
    initialValues: company && company.records,
  };
};

const mapDispatchToProps = dispatch => ({
  loadCompany: () => dispatch(loadCompany()),
  saveCompany: companyData => dispatch(saveCompany(companyData)),
});

const withConnect = connect(
  mapStateToProps,
  mapDispatchToProps,
);

const withReduxForm = reduxForm({
  form: 'companyForm',
  fields: requiredFields,
  validate,
  // initialValues: {
  //   company_name: 'company',
  // },
  destroyOnUnmount: false,
  enableReinitialize: true,
  keepDirtyOnReinitialize: true,
});

const initialState = {
  company_name: 'hello',
  website: '',
  industry: '',
  number_of_employees: '',
  phone_number: '',
  founded: '',
  address: '',
  city: '',
  state: '',
  zip_code: '',
  country: '',
  wiki: '',
  headquarter: '',
  speciality: '',
  type: '',
};

const enhance = compose(
  withReduxForm,
  withConnect,
  withState('company', 'updateCompany', initialState),
  withHandlers({
    handleChange: props => ({ target: { name, value } }) => {
      props.updateCompany({ ...props.company, [name]: value });
    },
    handleSubmit: props => (event) => {
      event.preventDefault();
      props.saveCompany(props.company);
    },
  }),
  setStatic('getDerivedStateFromProps', (nextProps) => {
    const { company } = nextProps.getCompany;
    if (company && company.records !== undefined) {
      console.log('company records getDerivedStateFromProps', company.records);
      return {
        company: company.records,
      };
    }
    return null;
  }),
  lifecycle({
    componentDidMount() {
      this.props.loadCompany();
    },
  }),
);

export default enhance;



const Company = ({
  company,
  handleChange,
  handleSubmit,
}: {
  company: Object,
  handleChange: Function,
  handleSubmit: Function
}) => {
  console.log('company', company);
  return (
    <React.Fragment>
      <FormHeadline headline="Company" weight="400" />
      <Wrapper>
        <GridContainer container spacing={24}>
          <StyledForm autoComplete="off" onSubmit={handleSubmit}>
            <FormWrapper>
              <input
                name="company_name"
                id="company_name"
                type="text"
                label="Company Name"
                className="input-field"
                value={company.company_name}
                onChange={handleChange}
              />
              {/* <Field
                id="company_name"
                name="company_name"
                type="text"
                label="Company Name"
                className="input-field"
                value="Hello"
                onChange={handleChange}
                component={GTextField}
                required
                margin="normal"
              /> */}
              <Field
                id="website"
                name="website"
                type="text"
                label="Website"
                placeholder="Website"
                className="input-field"
                value={company.website}
                onChange={handleChange}
                component={GTextField}
                required
                margin="normal"
              />
              </FormWrapper>
            </StyledForm>
          </GridContainer>
        </Wrapper>
      </React.Fragment>
    );
  };

  export default enhance(Company);


  generic text field 

  const GTextField = ({
    input,
    label,
    meta: { touched, error },
    ...rest
  }: {
    input: any,
    label: Node,
    meta: {
      touched: boolean,
      error: boolean
    }
  }) => {
    console.log('rest', input);
    return (
      <TextField
        label={label}
        helperText={touched && error}
        error={!!(touched && error)}
        {...input}
        {...rest}
      />
    );
  };

这有效,但不适用于领域

<input
  name="company_name"
  id="company_name"
  type="text"
  label="Company Name"
  className="input-field"
  value={company.company_name}
  onChange={handleChange}
/>

更新

props.initialValues显示以下内容,但该字段仍未更新

enter image description here

这是完整的代码

https://gist.github.com/MilanRgm/e3e0592c72a70a4e35b72bb6107856bc

2 个答案:

答案 0 :(得分:0)

您好,首先用注释掉的字段组件本身替换输入标签,然后在reduxform中设置这些标志

const withReduxForm = reduxForm({
 form: 'companyForm',
 fields: requiredFields,
 validate,
 destroyOnUnmount: false,
 enableReinitialize: true,
 keepDirtyOnReinitialize: true
});

,以及将带有服务器响应的initialValues道具传递到表单容器

{
  company_name: 'response value from server'
}

答案 1 :(得分:0)

您好,您可以在fiddle link处查看InitialValues示例。以您的减速器为例

  const mapStateToProps = state => ({ 
   getCompany: state.profile.companyReducer, 
   initialValues: state.profile.[your reducer object] });