繁体   English   中英

使用 Formik 响应动态输入

[英]React Dynamic inputs with Formik

我试图在按下按钮后动态删除输入字段,并从 Formik 中删除键及其值。 我正在使用 useFormik 钩子来实现。 问题是当我按下按钮删除输入字段时,它被删除但键和值保留在 useFormik 中。 当我再次按下按钮时,另一个输入字段被删除,并且先前的键和值从 useFormik 中删除。 从 useFormik 中删除值落后了一步。 我如何更改它以便它在输入字段的同时删除键和值?

以下是 Formik 的初始值。

const formik = useFormik({
    initialValues: {
      Produkt1:
        "",
      Produkt2:
        "",
    },
    validationSchema: frontProductUrls(),
    enableReinitialize: true,
    onSubmit: (values) => {
      console.log(values);
    },
    setFieldValue: () => {
      delete fields.length - 1;
    },
  });

这个数组我用来动态添加删除和呈现输入字段。

const [fields, setFields] = useState([
    { name: "Produkt1", label: "Produkt 1" },
    { name: "Produkt2", label: "Produkt 2" },
  ]);

这里是 function 删除数组中的最后一个输入,并从 useFormik 中删除键和值。

const removeField = (e) => {
    formik.setFieldValue(`Produkt${fields.length + 1}`, undefined, false);

    let updatedFields = [...fields];
    updatedFields.splice(fields.length - 1, 1);
    setFields(() => updatedFields);
  };

这个 function 用于添加新的输入字段。 这项工作很好,它添加了新的输入,并且还在 useFormik 中添加了新的密钥。

const addField = () => {
    if (fields.length > 3) return;

    const newProduct = `Produkt${fields.length + 1}`;
    formik.setFieldValue(newProduct, "");
    setFields([
      ...fields,
      {
        name: newProduct,
        label: newProduct,
      },
    ]);
  };

这是呈现字段的代码。

{fields.map((field, index) => {
          return (
            <div key={index} className="mb-4">
              <label
                htmlFor={field.name}
                className="block text-gray-700 font-medium mb-2"
              >
                {field.label}
              </label>
              <input
                id={field.name}
                name={field.name}
                type="text"
                onChange={formik.handleChange}
                value={formik.values[field.name]}
                className="border border-gray-400 p-2 rounded-lg w-full"
              />
            </div>
          );
        })}

    ```

我不得不添加这段代码

formik.setFieldValue(`Produkt${fields.length}`, "");
    setFields(fields.filter((_, i) => i !== fields.length - 1));
 useEffect(() => {
    formik.
    formik.setValues({ fields });
  }, [fields]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM