67 votes

React Formik: comment utiliser onChange et onBlur personnalisé

Je suis partant avec le formik bibliothèque pour réagir, et je n'arrive pas à comprendre l'utilisation des accessoires handleChange et handleBlur.

Selon les docs, handleBlur peut être définie comme un accessoire sur un <Formik/>, et doit ensuite être transmis manuellement vers le bas à l' <input/>.

J'ai essayé, sans succès : (Je vais garder le code sur handleBlur pour plus de clarté)

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>}
  />;

Quel est le problème avec cette approche ? Comment sont handleBlur et handleChange effectivement censé être utilisé ?

66voto

Rico Chen Points 61

Vous devrez supprimer le premier handleBlur de Formik car l'événement de flou n'est valide qu'au niveau du champ et faire quelque chose comme ceci dans votre élément Field:

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X