Redux-form:如何在向导表单上设置初始值?

时间:2017-12-10 08:55:02

标签: javascript reactjs redux redux-form

我有一个字段Location,这是API的必填字段,因此无法提交为空白。所以我正在尝试将0设置为initialValue字段。 Location字段位于表单的第二步,initialValues上的WizardFormSecondPage设置会从状态中删除所有输入的先前输入数据。如何为initialValue字段设置Location并在第一步中保留我的所有数据?

位置组件:

export class GetLocation extends Component{
constructor(){
    super();
    this.getMyLocation = this.getMyLocation.bind(this);
}


getMyLocation = () => {
    const location = window.navigator && window.navigator.geolocation;

    if (location) {
        location.getCurrentPosition((position) => {
            this.props.onLocationChanged(position.coords);
        },
            (positionError) => {
            console.log(positionError.message);
            this.props.onLocationChanged("0")
        },{maximumAge:0, timeout: 60000})
    } else {
        console.log();
        this.props.onLocationChanged("0")
    }
};

render(){
    return(
        <div>
            <p>Your location is </p>
            <Field
                name="latitude"
                component="input"
                className="form-control" initialValues={0.0}
            />
            <Field
                name="longitude"
                component="input"
                className="form-control"
            /><br/>
            <button type="button" className="btn btn-success" onClick={this.getMyLocation.bind(this)}>Get Geolocation</button>
        </div>

    );
}

}

WizardFormSecondPage

 let WizardFormSecondPage = props => {
 const { handleSubmit, previousPage} = props;
 const onLocationChanged = (loc) => {
    props.change('location.latitude', loc.latitude);
    props.change("location.longitude", loc.longitude);
};

return (
<form onSubmit={handleSubmit} className="form-horizontal">
  <div className="panel">
    <div className="form-group">
      <label className="control-label col-sm-2" htmlFor="address">
        Location
      </label>
        <div className="row">
          <div className="col-sm-12">
              <p className="label-lead">Own Address</p>
                 <FormSection name="location" component={Address}>
                    <Address />
                </FormSection>

              <p className="label-lead">Location Coordinates</p>
              <FormSection name="location" component={GetLocation}>
                  <GetLocation onLocationChanged={onLocationChanged}  />
              </FormSection>
          </div>
        </div>
      </div>              
  </div>

  <div className="clearfix">
      <button type="button" className="previous pull-left btn btn-default" onClick={previousPage}>
        Previous
      </button>
      <button type="submit" className="next pull-right btn btn-primary">
        Next
      </button>
    </div>
  </div>
</form>
  );
};

export default reduxForm({
  form: "wizard", //                 <------ same form name
  destroyOnUnmount: false, //        <------ preserve form data
  forceUnregisterOnUnmount: true, // <------ unregister fields on unmount
  validate
})(WizardFormSecondPage);

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

Turns out, my approach was wrong. I could set an initialValue to the entire WizardForm and it would not initialize again. So, in stead of trying to set initialize WizardFormSecondPage, I had to set values on WizardForm.js. Here's my WizardForm.js:

class WizardForm extends Component {
constructor(props) {
super(props);
this.nextPage = this.nextPage.bind(this);
this.previousPage = this.previousPage.bind(this);
this.state = {
  page: 1,
};
}
nextPage() {
this.setState({ page: this.state.page + 1 });
}

previousPage() {
this.setState({ page: this.state.page - 1 });
}

onSubmit(values, dispatch) {

    return dispatch(saveData(values));
    // Call the action creator which is responsible for saving data here.
}

render() {
const { onSubmit } = this.props;
const { page } = this.state;
return (
  <div>
    {page === 1 && <WizardFormFirstPage onSubmit={this.nextPage} />}
    {page === 2 &&
      <WizardFormSecondPage
        previousPage={this.previousPage}
        onSubmit={this.nextPage}
      />}

      {page === 3 &&
      <WizardFormPreview
          previousPage={this.previousPage}
          onSubmit={this.onSubmit}
      />}
  </div>
);
}
}

WizardForm.propTypes = {
 onSubmit: PropTypes.func.isRequired,
};
// this part sets the initial values. connect if you need store.
WizardForm = reduxForm ({
  form: 'wizard',
  initialValues: {
    location: {
     latitude: "0.0",
     longitude: "0.0"
   }
  }
})(WizardForm)


export default WizardForm;