J'utilise formik pour les formulaires de mon application react.
class myComponent extends Component { constructor(props) { this.state = { inputData: {} } } render() { return( <Formik>{({ errors, handleChange, values }) => ( console.log(values); <Field type="text" name="address" onChange={handleChange} /> )} </Formik> ) } }
La question: comment puis-je transmettre des valeurs à l'état?
3 Réponses :
Vous pouvez faire une méthode handleChange sur votre composant de classe comme ci-dessous:
class myComponent extends Component { constructor(props) { this.state = { inputData: {} } } handleChange = (event) => { this.setState({ inputData: event.target.value }); } render() { return( <Formik> {({ errors, handleChange, values }) => { console.log(values); return( <Field type="text" name="address" onChange={this.handleChange} /> ); }} </Formik> ); } }
C'est une mauvaise solution pour mon cas, car si je change de méthode handleChange, je devrai définir la fonction de validation. Il y a beaucoup de formulaires dans mon application, donc je n'ai besoin que d'une seule fonction de validation par défaut
vraiment il n'y a pas une telle méthode pour passer des valeurs à l'état? ou juste hors du Formik
Eh bien, pour la validation, vous pouvez utiliser la bibliothèque Yup comme indiqué dans les exemples Formik, pour moi, c'est le moyen le plus simple de valider les entrées. Parce que le Formik ne transmet que les valeurs de l'attribut values
dans les enfants en tant que fonction, est le seul moyen d'obtenir les valeurs à valider. L'utilisation de la méthode onChange
est une meilleure pratique car vous pouvez valider lorsque l'utilisateur modifie l'entrée, en transformant les messages de validation en temps réel pour une meilleure ux. Essayez d'utiliser Yup sur Formik comme indiqué sur ici . Vous pouvez également utiliser la validation sur onSubmit
.
Je pense que la meilleure pratique recommandée est de n'utiliser que l'état Formik afin d'éviter tout effet secondaire d'avoir l'état stocké dans 2 emplacements (Formik + l'état du composant). Je cherchais également à réaliser ce que vous vouliez et j'ai trouvé le composant suivant - https://github.com/jaredpalmer / formik-effect - cela vous permettra de décorer la fonction handleChange
. Cependant, après avoir lu le README de ce composant, j'ai décidé de n'utiliser que l'état Formik et de transmettre ses valeurs à toute fonction nécessitant des valeurs dans cet état.
Pour transmettre les valeurs à une fonction, j'ai utilisé le modèle suivant:
class Example extends Component { handleValues(values) { // Do something with values } render() { return ( <Formik> ({values}) => {<button onClick={() => this.handleValues(values)}>Do something</button>} </Formik> ); } }
Si vous n'avez pas besoin des changements d'état lors de leur saisie, je dirais que la meilleure option serait d'utiliser la fonction onSubmit
pour mettre à jour votre état. Cela signifie également qu'il aura passé la validation avant que l'état n'ait été mis à jour. Il semble que vous ayez une fonction de validation par défaut, donc vous pouvez également ajouter le prop validate
et l'utiliser pour appeler votre validateur.
class myComponent extends Component { constructor(props) { this.state = { inputData: {} } } render() { return( <Formik initialValues={values} onSubmit={(values) => { // Set updated state here }} render={({ submitForm }) => ( <form onSubmit={submitForm}> <Field type="text" name="address" onChange={handleChange} /> <button type="submit">Submit</button> </form> )} /> ) } }
vous pouvez utiliser la méthode onchange personnalisée et la définir sur l'état