依赖字段 React FormIK - 最后一个字段的值取决于其他两个字段

Posted

技术标签:

【中文标题】依赖字段 React FormIK - 最后一个字段的值取决于其他两个字段【英文标题】:Dependent Field React FormIK - Value of last Field Depends on the Two Other Fields 【发布时间】:2022-01-04 23:35:32 【问题描述】:

我在一个表单中有 3 个字段:fieldA fieldB fieldC

我想要什么:我希望用户尚未填写的第三个字段成为其他两个字段的函数。例如。如果将字段fieldAfieldB 分别设置为1 和2,我希望fieldC 为1/2。如何让这个动态的、依赖的字段工作?

我目前正在使用 FormIK 包,但会接受任何答案。

这是我当前的构建:

const MyFieldC = (props) => 
  const 
    values:  textA, textB ,
    touched,
    setFieldValue,
   = useFormikContext();
  const [field, meta] = useField(props);

  React.useEffect(() => 
    // set the value of textC, based on textA and textB
    if (
      textA.trim() !== '' &&
      textB.trim() !== '' &&
      touched.textA &&
      touched.textB
    ) 
      setFieldValue(props.name, textA/textB);
    
  , [textB, textA, touched.textA, touched.textB, setFieldValue, props.name]);

  return (
    <>
      <input ...props ...field />
      !!meta.touched && !!meta.error && <div>meta.error</div>
    </>
  );
;

const MyFieldA = (props) => 
  const 
    values:  textC, textB ,
    touched,
    setFieldValue,
   = useFormikContext();
  const [field, meta] = useField(props);

  React.useEffect(() => 
    // set the value of textC, based on textA and textB
    if (
      textC.trim() !== '' &&
      textB.trim() !== '' &&
      touched.textA &&
      touched.textB
    ) 
      setFieldValue(props.name, textA/textB);
    
  , [textB, textC, touched.textA, touched.textB, setFieldValue, props.name]);

  return (
    <>
      <input ...props ...field />
      !!meta.touched && !!meta.error && <div>meta.error</div>
    </>
  );
;

const MyFieldB = (props) => 
  const 
    values:  textA, textC ,
    touched,
    setFieldValue,
   = useFormikContext();
  const [field, meta] = useField(props);

  React.useEffect(() => 
    // set the value of textC, based on textA and textB
    if (
      textA.trim() !== '' &&
      textC.trim() !== '' &&
      touched.textA &&
      touched.textC
    ) 
      setFieldValue(props.name, textA/textC);
    
  , [textC, textA, touched.textA, touched.textC, setFieldValue, props.name]);

  return (
    <>
      <input ...props ...field />
      !!meta.touched && !!meta.error && <div>meta.error</div>
    </>
  );
;

function Form() 
  // Note that we provide initalValues all 3 fields.
  const initialValues =  textA: '', textB: '', textC: '' ;
  return (
    <div className="App">
      <Formik
        initialValues=initialValues
        onSubmit=async (values) => alert(JSON.stringify(values, null, 2))
      >
        <div className="section">
          <Form>
            <label>
              FieldA
              <MyFieldA name="textA" />
            </label>
            <label>
              FieldB
              <MyFieldB name="textB" />
            </label>
            <label>
              FieldC
              <MyFieldC name="textC" />
            </label>
            <button type="submit">Submit</button>
          </Form>
        </div>
      </Formik>
    </div>
  );

如果我为 3 个值中的 2 个提交值,我会收到错误:

TypeError: textB.trim 不是函数

【问题讨论】:

我在想,MyFieldC 是如何获取values: textA, textB textAtextB 的值的。 【参考方案1】:

您可以使用 values 道具并更改 fieldC 的值。

const initialValues=textA:'',textB :''   

  <Formik
            initialValues=initialValues
            onSubmit=async (values) => alert(JSON.stringify(values, null, 2))
          >
           (values) => (
             <Form>
                <label>
                  FieldA
                  <MyFieldA name="textA" />
                </label>
                <label>
                  FieldB
                  <MyFieldB name="textB" />
                </label>
                <label>
                  FieldC
                  <MyFieldC name="textC" value=(values.textA && values.textB )
     ? (values.textA/values.textB) : ''/>
                </label>
                <button type="submit">Submit</button>
              </Form>
           )
         </Formik>

【讨论】:

更多详情您可以访问formik.org/docs/api/field#example

以上是关于依赖字段 React FormIK - 最后一个字段的值取决于其他两个字段的主要内容,如果未能解决你的问题,请参考以下文章

React 故事书显示有错误的 formik 表单

React Formik 中的动态输入字段

清除带有初始值 React 的 Formik 字段

使用 Formik 和 Yup 和 React-select 进行验证

如何结合 Formik 使用 React NumberFormat 包?

如何动态访问嵌套错误/触及formik字段