React Formik不适用于数字输入

时间:2019-10-01 17:56:40

标签: javascript reactjs antd formik

使用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);

所以基本上:

    handleChange组件正确调用了
  • InputNumber
  • 数字字段更改时,
  • 不会触发验证
  • 文本字段更改时触发验证
  • onblur(从输入数字字段单击后单击)时,将使用默认值触发验证

这似乎是一个错误,但是我想我做错了。

感谢您的帮助。


有效代码:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

来自antd文档:

Input -> onChange -> function(e) 这是SyntheticEvent

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

答案 1 :(得分: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,它还具有第三个布尔参数,用于确定是否运行验证。因此,如果在主要true组件上启用了v,则在validateOnChange之后传入Formik应该触发验证。