【问题标题】:How to set input value of one field based on another field in formik?如何根据formik中的另一个字段设置一个字段的输入值?
【发布时间】:2020-08-04 10:20:18
【问题描述】:

我是 ReactJS 的新手,在我的 Web 应用程序中使用 formik。在表单内部,我必须根据用户在另一个字段中输入的值来设置字段的值。

下面是我的表格:

<Formik
   initialValues={this.state.data}
   enableReinitialize={true}
   onSubmit={this.formSubmit} >
   {({ values, setFieldValue }) => (
   <Form>
      <FormGroup>
         <Field className="form-control" name="Price" type="number">
         </Field>
         <Label className="impo_label">Price</Label>
      </FormGroup>
      <FormGroup>
         <Field className="form-control" name="Qty" type="number">
         </Field>
         <Label className="impo_label">Qty</Label>
      </FormGroup>
      <FormGroup>
         <Field className="form-control" value={values.Price*values.Qty} name="Amount" type="number">
         </Field>
         <Label className="impo_label">Amount</Label>
      </FormGroup>
      <FormGroup>
         <Field className="form-control" name="Discount" type="number">
         </Field>
         <Label className="impo_label">Discount</Label>
      </FormGroup>
      <FormGroup>
         <Field className="form-control" name="Discount" type="number">
         </Field>
         <Label className="impo_label">Discount</Label>
      </FormGroup>
      <FormGroup>
         <Field className="form-control" value={(values.Amount * values.Discount)/100} name="FinalAmount" type="number">
         </Field>
         <Label className="impo_label">FinalAmount</Label>
      </FormGroup>
   </Form>
   )}
</Formik>

在这个表单中,我想根据用户输入的价格和数量来设置金额的值。为此,我使用了 value={values.Price*values.Qty},即在文本框中正确显示该值,但该值未在 values.Amount 中设置,因此未正确评估 FinalAmount。

我知道这里的问题,我必须使用 setFieldValue 来更新 {values.Amount}。同样,我也必须使用 setFieldValue 来更新 {values.FinalAmount} 以及价格和数量的变化,因为变化价格或数量中的任何一个都应反映在 Amount 和 FinalAmount 中。此外,我必须在更改折扣时将 setFieldValue 用于 FinalAmount。有没有其他方法可以直接设置 {values.Amount} 和 {values.FinalAmount} 的值,而无需在更改价格、数量和折扣时写入 setFeildValue。使用 value={values.Price*values.Qty} 作为 Amount 应该更新 {values.Amount}。

【问题讨论】:

    标签: reactjs formik


    【解决方案1】:

    最后,在尝试了各种方法后,我得到了解决方案。我只是在值属性中设置了 Amount 和 FinalAmount,例如 value={values.Amount = values.Price*values.Qty}。因此,{values.Amount} 字段在没有使用 setFieldValue 的情况下进行了更新。结果,基于{values.Amount}{values.FinalAmount} 被正确评估。我不知道我们可以像这样直接设置formik值而不使用setFieldValue。现在我的最终形式变为:

    <Formik
       initialValues={this.state.data}
       enableReinitialize={true}
       onSubmit={this.formSubmit} >
       {({ values, setFieldValue }) => (
       <Form>
          <FormGroup>
             <Field className="form-control" name="Price" type="number">
             </Field>
             <Label className="impo_label">Price</Label>
          </FormGroup>
          <FormGroup>
             <Field className="form-control" name="Qty" type="number">
             </Field>
             <Label className="impo_label">Qty</Label>
          </FormGroup>
          <FormGroup>
             <Field className="form-control" value={values.Amount = values.Price*values.Qty} name="Amount" type="number">
             </Field>
             <Label className="impo_label">Amount</Label>
          </FormGroup>
          <FormGroup>
             <Field className="form-control" name="Discount" type="number">
             </Field>
             <Label className="impo_label">Discount</Label>
          </FormGroup>
          <FormGroup>
             <Field className="form-control" name="Discount" type="number">
             </Field>
             <Label className="impo_label">Discount</Label>
          </FormGroup>
          <FormGroup>
             <Field className="form-control" value={values.FinalAmount = (values.Amount * values.Discount)/100} name="FinalAmount" type="number">
             </Field>
             <Label className="impo_label">FinalAmount</Label>
          </FormGroup>
       </Form>
       )}
    

    【讨论】:

      【解决方案2】:

      如果您正在使用useFormik() 挂钩,并且您希望自己计算字段/输入值,那么您只需设置dirty:true 并传递给挂钩。

      const formik = useFormik({ initialValues, onSubmit, dirty: true});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 2021-12-21
        • 1970-01-01
        相关资源
        最近更新 更多