使用带有React的Formik时丢弃更改

问题描述 投票:2回答:2

我使用qactxswpoi形式与React。每当用户提交(handleSubmit)时,我都会选择是否放弃更改或保留更改。

在我的渲染中,

Formik

handleSubmit()

      <Formik
        initialValues={this.state.experiment}
        onSubmit={this.handleSubmit}
        component={formikProps => (
          <ExperimentForm {...formikProps} submitText="Save Changes" />
        )}
      />

keepChanges()和discardChanges()

  handleSubmit(formdata: any, actions: any) {
    const data = processFormData(formdata);

    let changes = this.detectChanges(this.state.experiment, data);

    this.setState({ tempFormData: data });
    // changed field exists
    if (changes.length !== 0) {

      this.setState({ 
        isDialogOpen: true,
        changedFields: changes,
      });

    } else {
      actions.setSubmitting(false);
      this.setState({
        message: 'Nothing Changed',
      });
    }
  }

keepChanges () { const data = this.state.tempFormData makeMutation(UpdateExperimentQuery, { update: { id: this.props.match.params.id, data, }, }) .then(responseData => { console.log(responseData) this.setState({ isDialogOpen: false }); this.props.history.push('/i/experiments'); }) .catch(err => { this.setState({ message: 'Error Updating Experiment', }); console.log(err); }); } discardChanges () { this.setState({ isDialogOpen: false }); this.componentWillMount(); } 使用给定字段成功更新数据,但是keepChanges()只是关闭对话框但是没有将数据重置为原始值,即使我尝试调用discardChanges来获取并呈现数据库中的原始未更改数据。

当我选择放弃更改时,如何重置字段?

编辑

componentWillMount()

//当我做React.createRef()时出错

  discardChanges () {
      this.formik.current.resetForm();
      this.setState({ isDialogOpen: false });
      this.componentWillMount();
  }

Aaditi

class EditExperiment extends Component<EditExperimentProps, EditState> {
  constructor(props: EditExperimentProps) {
    super(props);
    this.formik = React.createRef();

    this.state = {
      experiment: null,
      message: null,
      changedFields: [],
      isDialogOpen: false,
      tempFormData: []
    };

    this.handleSubmit = this.handleSubmit.bind(this);
    this.clearMessage = this.clearMessage.bind(this);
    this.detectChanges = this.detectChanges.bind(this);
    this.keepChanges = this.keepChanges.bind(this);
    this.discardChanges = this.discardChanges.bind(this);
  }
reactjs formik
2个回答
5
投票

要重置Formik,您需要调用type EditExperimentProps = { history: RouterHistory, match: Match, experiments: ExperimentsState, refetch: () => void, }; type EditState = { experiment: ?Experiment, message: ?string, }; class EditExperiment extends Component<EditExperimentProps, EditState> { constructor(props: EditExperimentProps) { super(props); this.formik = React.createRef(); this.state = { experiment: null, message: null, changedFields: [], isDialogOpen: false, tempFormData: [] }; this.handleSubmit = this.handleSubmit.bind(this); this.clearMessage = this.clearMessage.bind(this); this.detectChanges = this.detectChanges.bind(this); this.keepChanges = this.keepChanges.bind(this); this.discardChanges = this.discardChanges.bind(this); } - 请参阅示例resetForm

here

编辑:

还有另一种方法可以通过使用react handleSubmit(formdata: any, actions: any) { ... // changed field exists if (changes.length !== 0) { ... } else { actions.setSubmitting(false); actions.resetForm(); } } s获取“操作”并在组件中的任何位置调用它们:

ref

2
投票

如果要使用resetForm,则需要包含初始状态。例:

constructor(props) {
  super(props);
  this.formik = React.createRef();
}

//somewhere in render

<Formik
  ref={this.formik}
  initialValues={this.state.experiment}
  onSubmit={this.handleSubmit}
  component={formikProps => (
    <ExperimentForm {...formikProps} submitText="Save Changes" />
  )}
/>

// now somewhere else in the same component ...
componentDidUpdate(prevProps) {
  if(somethingHappend) {
    if(this.formik.current) {
      this.formik.current.resetForm();
    }
  }
}

这意味着您还需要保存initialState:

    this.formik.current.resetForm(this.initialState.experiment);
© www.soinside.com 2019 - 2024. All rights reserved.