javascript - 值(value)观问题 Formik

标签 javascript html reactjs formik

GitHub discussion about this issue - https://github.com/jaredpalmer/formik/issues/529

我将 formik 值传递给在 <Field/> 中调用的函数的 onChange 但是当我输入 <Field/> , 最后一个字符不属于函数。

代码沙箱 - link

截图:

enter image description here

最小代码实例:

import React from "react";
import ReactDOM from "react-dom";
import { Formik, Form, Field, FieldArray } from "formik";

function App() {
  //------ HERE ----------
  const getValues = values => console.log(values.fields[0]);
  //----------------------
  return (
    <>
      <Formik
        initialValues={{ fields: [""] }}
        onSubmit={(values, actions) => {
          actions.setSubmitting(false);
          console.log(values);
          return false;
        }}
        render={({ setFieldValue, values }) => (
          <Form>
            <FieldArray
              name="fields"
              render={() => (
                <Field
                  type="text"
                  name="fields.0"
                  placeholder="Write something"
                  onChange={e => {
                    setFieldValue("fields.0", e.target.value);
                    //---------------
                    getValues(values);
                    //---------------
                  }}
                />
              )}
            />
          </Form>
        )}
      />
    </>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));

最佳答案

此答案基于 Formik v1.5.7

您正在尝试在调用 setFieldValue 后立即在代码中获取 values 的陈旧值,这在内部执行异步操作,因此您不能期望值在它之后立即更改(调用)返回。因此,当您尝试从 values 中记录值时,您会在当前(运行的)渲染周期中获得状态对象。

values 发生变化时,Formik 会重新呈现表单,其中它将具有您试图获得的所需值。

我在您的示例中向上移动了代码来解释这一点。

这是 updated code link .

由于这个问题是在我回答之后更新的,所以我会评论这个具体的 GitHub issue .问题出在增强开发请求中,注释中的解决方案在您的示例中不起作用,因为 values 仍将是“旧”值。

这就是为什么 async await 解决方案在这种情况下不起作用的原因:

onChange={async e => {
    await setFieldValue("fields.0", e.target.value);
    getValues(values);
}}

以上代码在名为 setFieldValue 的函数上单击事件 awaits 时执行,并在内部设置状态,这是放置在执行堆栈中的异步操作。调用返回并 console.log 记录 values 恰好是现有渲染周期 values

希望澄清。

关于javascript - 值(value)观问题 Formik,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56613496/

相关文章:

reactjs - 多个输入上的单个模糊事件

javascript - 使用 AJAX 和 PHP 删除用户记录时面临的问题

javascript - Material Design(materialize css)模态,IE问题

html - 在带有负边距 CSS 的文本旁边创建图像

javascript - 我需要在 react 功能中清除超时吗?

html - 当表格容器具有 Overflow-x auto 时,工具提示会被切断

javascript - typescript 或 JavaScript 将对象的嵌套数组转换为键、值对

javascript - 使用 Object 属性作为 VueJS 数据表中的字段值

javascript - 更改事件不适用于多个选择输入

html - 2 列 div 中的行分隔符