React Formik:如何使用自定义 onChange 和 onBlur

Posted

技术标签:

【中文标题】React Formik:如何使用自定义 onChange 和 onBlur【英文标题】:React Formik : how to use custom onChange and onBlur 【发布时间】:2018-07-06 02:55:00 【问题描述】:

我开始使用 formik 库进行反应,但我无法弄清楚道具 handleChange 和 handleBlur 的用法。

根据the docs,handleBlur 可以设置为<Formik/> 上的道具,然后必须手动向下传递给<input/>

我试过了,没有成功: (为了更清楚,我保留了有关 handleBlur 的代码)

import React from "react";
import  Formik, Field, Form  from "formik";
import  indexBy, map, compose  from "ramda";
import  withReducer  from "recompose";

const MyInput = ( field, form, handleBlur, ...rest ) =>
  <div>
    <input ...field onBlur=handleBlur ...rest />
    form.errors[field.name] &&
      form.touched[field.name] &&
      <div>
        form.errors[field.name]
      </div>
  </div>;

const indexById = indexBy(o => o.id);
const mapToEmpty = map(() => "");

const EmailsForm = ( fieldsList ) =>
  <Formik
    initialValues=compose(mapToEmpty, indexById)(fieldsList)
    validate=values => 
      // console.log("validate",  values );
      const errors =  values ;
      return errors;
    
    onSubmit=values => 
      console.log("onSubmit",  values );
    
    handleBlur=e => console.log("bluuuuurr",  e )
    render=( isSubmitting, handleBlur ) =>
      <Form>
        <Field
          component=MyInput
          name="email"
          type="email"
          handleBlur=handleBlur
        />
        <button type="submit" disabled=isSubmitting>
          Submit
        </button>
      </Form>
  />;

这种方法有什么问题? handleBlur 和 handleChange 实际上应该如何使用?

【问题讨论】:

【参考方案1】:

您需要从Formik 中删除第一个handleBlur,因为模糊事件仅在字段级别有效,并在您的字段元素中执行以下操作:

<Field
    component=MyInput
    name="email"
    type="email"
    onBlur=e => 
        // call the built-in handleBur
        handleBlur(e)
        // and do something about e
        let someValue = e.currentTarget.value
        ...
    
/>

见https://github.com/jaredpalmer/formik/issues/157

【讨论】:

这没问题,只要你不需要操纵值。就我而言,我想在自定义模糊处理程序中重新格式化字段的值,这会触发验证问题,因为setFieldValue() 不是异步的。见github.com/jaredpalmer/formik/issues/529 我认为这是一个单独的 Formik 问题,在没有一些变通方法的情况下,您无法在同一字段上执行 setFieldValue() 后立即获得更新的字段值。我是那次讨论的参与者之一。【参考方案2】:

我使用 onChange 方法遇到了同样的问题,我认为它在 formik 道具中不存在。

所以我使用了 onSubmit 方法,因为它在 formik 道具中可用,它为我们提供了字段值,然后像这样将这些值传递给关注函数......

<Formik
          initialValues=initialValues
          validationSchema=signInSchema
          onSubmit=(values) => 
            registerWithApp(values);
            console.log(values);
          
        >

你可以在那里使用,我只是更新了状态并将其传递给 axios,就像这样......

    const [user, setUser] = useState(
    name: "",
    email: "",
    password: ""
  );

  const registerWithApp = (data) => 
    const  name, email, password  = data;
    setUser(
      name:name,
      email:email,
      password:password
    )
   
    if (name && email && password) 
      axios.post("http://localhost:5000/signup", user)
        .then(res => console.log(res.data))
    
    else 
      alert("invalid input")
    ;
  

及其工作... 希望对你有帮助。

【讨论】:

以上是关于React Formik:如何使用自定义 onChange 和 onBlur的主要内容,如果未能解决你的问题,请参考以下文章

如何在 formik 字段组件中显示自定义 <Errormessage> 并禁用默认消息

使用带有formik的react-select时无法读取未定义的属性“类型”

如何结合 Formik 使用 React NumberFormat 包?

react之form表单工具:formik+yup

如何在 react-apollo-hooks 和 formik 中使用突变?

如何将 react-intl-tel-input 与 formik 集成?