代码之家  ›  专栏  ›  技术社区  ›  Samia Ruponti

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

  •  1
  • Samia Ruponti  · 技术社区  · 7 年前

    我有一块地 Location ,这是yhe API的必填字段,因此不能为空提交。所以我试着 0 initialValue 用于现场。这个 地方 字段位于表单和设置的第二步 initialValues 在…上 WizardFormSecondPage 从状态中删除所有以前的输入数据。如何设置 初始值 对于 地方 字段并将所有数据保存在第一步中?

    位置组件:

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

    }

    向导表单第二页

     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 回复  |  直到 7 年前
        1
  •  2
  •   Anton Novik    5 年前

    事实证明,我的方法是错误的。我可以设置 initialValue 对整个 WizardForm 它不会再次初始化。因此,与其尝试设置initialize WizardFormSecondPage ,我必须设置值 WizardForm.js . 这是我的 向导窗体。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;