【问题标题】:React Formik does not work with number inputReact Formik 不适用于数字输入
【发布时间】:2020-01-31 01:18:30
【问题描述】:

使用FormikAnt Design,这是一个简单的设置。

您可以在此处看到粘贴的整个代码:

import React from "react";
import ReactDOM from "react-dom";

import "./styles.css";

import { Formik } from "formik";
import { Form, Input, InputNumber } from "antd";

function App() {
  const name = "name";
  const count = "count";

  return (
    <div className="App">
      <h1>Formik Testing</h1>

      <Formik
        initialValues={{ count: 32, name: "sd" }}
        validate={async values => {
          console.log("Validate", values);
          return {
            count: `Value ${values.count} is not valid.`
          };
        }}
        onSubmit={(values, actions) => {
          console.log(values);
        }}
        render={props => {
          return (
            <div>
              <Form>
                <Form.Item help={props.errors && props.errors[name]}>
                  <Input
                    id={name}
                    name={name}
                    type={"text"}
                    onChange={v => {
                      console.log("Text change ", v);
                      props.handleChange(v);
                    }}
                    onBlur={props.handleBlur}
                    defaultValue={props.initialValues[name]}
                    placeholder="Name"
                  />
                </Form.Item>
                <Form.Item help={props.errors && props.errors[count]}>
                  <InputNumber
                    id={count}
                    name={count}
                    type={"number"}
                    onChange={v => {
                      console.log("Number change ", v);
                      props.handleChange(v);
                    }}
                    onBlur={props.handleBlur}
                    defaultValue={props.initialValues[count]}
                    placeholder="Count"
                  />
                </Form.Item>
              </Form>
            </div>
          );
        }}
      />
    </div>
  );
}

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

所以基本上:

  • handleChangeInputNumber 组件正确调用
  • 验证在数字字段更改时触发
  • 文本字段更改时触发验证
  • onblur 时使用默认值触发验证(点击离开输入数字字段后)

这似乎是一个错误,但我认为我做错了什么。

感谢任何帮助。


实际代码:

https://codesandbox.io/s/gallant-architecture-0c8p2

(预览 css 似乎有一个错误 - 如果您看到多个箭头,请仅使用顶部的箭头)

【问题讨论】:

    标签: javascript reactjs antd formik


    【解决方案1】:

    您可以使用 Formik 内置的 setFieldValue 函数为输入定义自己的更改处理程序,该处理程序将直接设置数字值:

               <InputNumber
                        id={count}
                        name={count}
                        type={"number"}
                        onChange={v => {
                          props.setFieldValue(count, v);
                        }}
                        onBlur={props.handleBlur}
                        defaultValue={props.initialValues[count]}
                        placeholder="Count"
                      />
    

    根据the docs,它还有第三个布尔参数来确定是否运行验证。因此,如果在主 Formik 组件上启用了 validateOnChange,则在 v 之后传入 true 应该会触发验证。

    【讨论】:

      【解决方案2】:

      我不熟悉antd,但我看到的是,当我将InputNumber 更改为Input 时,它可以工作。

      基本上,InputNumber 将返回值而不是像 Input 这样的对象。

      来自antd 文档:

      Input -&gt; onChange -&gt; function(e) 这是 SyntheticEvent

      InputNumber -&gt; onChange -&gt; function(value: number | string) 只是一个值

      【讨论】:

      • 现在我意识到 Formik 不知道在只用一个数字调用 handleChange 时应该改变什么值。但是为什么会被允许呢?虽然您的解决方案似乎解决了问题,但InputNumber 的功能比Input 更多。你知道我如何打电话给handleChange 并指定已更改的字段吗?
      • 我刚刚意识到handleChange 实际上是handleChange&lt;T = unknown | React.ChangeEvent&lt;any&gt;&gt;(field: T): T extends React.ChangeEvent&lt;any&gt; ? void : ((e: unknown | React.ChangeEvent&lt;any&gt;) =&gt; void); 所以我想我必须找出如何为那个组件创建一个React.ChangeEvent
      • 我并不是说将 InputNumber 更改为 Input 是解决方案,我只是分享我的观察。 InputNumber 只是缺少它们,所以它是 antd 的东西,而不是 Formik 的东西。
      • 这可能是一种解决方法。 jaredpalmer.com/formik/docs/api/… 已编辑:我看到卢瑟福也提供了这个解决方案
      猜你喜欢
      • 2015-12-02
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 2019-08-09
      • 2014-02-19
      相关资源
      最近更新 更多