Je suis tombé sur un problème en travaillant sur un projet dont j'avais créé un formulaire à l'aide de React et sur la manière dont le remplissage automatique du navigateur interagissait avec celui-ci.
Vous savez, quand le navigateur met automatiquement votre nom d'utilisateur / mot de passe parce que vous l'avez déjà tapé dans le passé?
C'est le remplissage automatique, et c'est la cause de mon problème. En particulier, je l'ai répliqué sur Chrome et Firefox, mais n'importe quel navigateur peut rencontrer cela.
La forme était une forme habituelle et simple construite avec leuseState
accrocher.
Voici un exempleemail
champ du formulaire:
import { useState } from 'react'
//…
const [email, setEmail] = useState(’’)
<input
id=‘email’
type=‘email’
name=‘email’
value={email}
onChange={(event) => setEmail(event.target.value)}
/>
Lorsque vous saisissez l'e-mail, leemail
la valeur est mise à jour à l'aide desetEmail
et je l'aurai disponible sur l'événement de soumission de formulaire, afin que je puisse l'envoyer au serveur.
À un moment donné, j'ai réalisé que le navigateur remplissait automatiquement l'e-mail et le mot de passe, mais React ne l'a pas reconnu!
Peut-être parce qu'il remplit le champ avant que React ne soit complètement exécuté, il ne peut donc pas intercepter cet événement.
J'ai fait un peu de recherche et je me suis perdu dans un pays d'incohérences de navigateur et de différences dans le fonctionnement du remplissage automatique, j'ai donc dû créer une solution de contournement simple.
Je l'ai fait en utilisantuseRef
etuseEffect
:
import { useState, useEffect, useRef } from 'react'
Je crée une ref:
const emailField = useRef(null)
et dans le JSX je l'attache au champ de saisie:
<input
ref={emailField}
id='email'
type='email'
name='email'
value={email}
onChange={(event) => setEmail(event.target.value)}
/>
Ensuite, j'ai ajouté un morceau de code qui toutes les 100 ms recherche la valeur du champ et appellesetEmail()
pour le mettre à jour:
useEffect(() => {
let interval = setInterval(() => {
if (emailField.current) {
setEmail(emailField.current.value)
//do the same for all autofilled fields
clearInterval(interval)
}
}, 100)
})
Ce n'est pas idéal, cela implique une manipulation DOM, ce que nous devrions éviter lors de l'utilisation d'une bibliothèque comme React, mais cela fonctionne autour de ce problème.
Et s'il n'y a pas de remplissage automatique? Cela attendra simplement que le premier caractère soit tapé et arrêtera la boucle.
Téléchargez mon gratuitManuel React
Plus de tutoriels de réaction:
- Un exemple d'application simple React: récupérez les informations des utilisateurs de GitHub via l'API
- Construisez un compteur simple avec React
- Configuration de VS Code pour le développement de React
- Comment passer des accessoires à un composant enfant via React Router
- Créez une application avec Electron et React
- Tutoriel: créer une feuille de calcul avec React
- La feuille de route pour apprendre React
- Apprenez à utiliser Redux
- Premiers pas avec JSX
- Composants stylisés
- Introduction à Redux Saga
- Introduction à React Router
- Introduction à React
- Composants React
- Le DOM virtuel
- Réagir les événements
- L'état de réaction
- Accessoires de réaction
- Le fragment de réaction
- L'API de contexte React
- Réagir les types de prop
- Concepts React: déclaratif
- Réagir: comment afficher un composant différent en un clic
- Comment faire une boucle dans React JSX
- Props vs State dans React
- Devriez-vous utiliser jQuery ou React?
- Combien de JavaScript devez-vous connaître pour utiliser React?
- Introduction à Gatsby
- Comment référencer un élément DOM dans React
- Flux de données unidirectionnel dans React
- Réagir des composants d'ordre supérieur
- Événements de cycle de vie de React
- Concept de réaction: immuabilité
- Concept React: Pureté
- Introduction à React Hooks
- Introduction à create-react-app
- Concept de réaction: composition
- Réagir: composants de présentation vs composants de conteneur
- Fractionnement de code dans React
- Rendu côté serveur avec React
- Comment installer React
- CSS dans React
- Utilisation de SASS dans React
- Gestion des formulaires dans React
- Réagir StrictMode
- Portails de réaction
- Réagir les accessoires de rendu
- Test des composants React
- Comment passer un paramètre aux gestionnaires d'événements dans React
- Comment gérer les erreurs dans React
- Comment renvoyer plusieurs éléments dans JSX
- Rendu conditionnel dans React
- React, comment transférer des accessoires vers des composants enfants
- Comment obtenir la valeur d'un élément d'entrée dans React
- Comment utiliser le hook useState React
- Comment utiliser le hook useCallback React
- Comment utiliser le hook useEffect React
- Comment utiliser le hook useMemo React
- Comment utiliser le hook useRef React
- Comment utiliser le hook useContext React
- Comment utiliser le hook useReducer React
- Comment connecter votre application React à un backend de la même origine
- Le didacticiel du routeur Reach
- Comment utiliser les outils de développement React
- Comment apprendre React
- Comment déboguer une application React
- Comment rendre du HTML dans React
- Comment réparer l'erreur `dangerouslySetInnerHTML` ne correspond pas à l'erreur dans React
- Comment j'ai résolu un problème avec un état de formulaire de connexion React et le remplissage automatique du navigateur
- Comment configurer HTTPS dans une application React sur localhost
- Comment corriger l'erreur "Impossible de mettre à jour un composant lors du rendu d'un composant différent" dans React
- Puis-je utiliser des hooks React dans un conditionnel?
- Utiliser useState avec un objet: comment mettre à jour
- Comment déplacer des blocs de code avec React et Tailwind
- Réagissez, concentrez un élément dans React lorsqu'il est ajouté au DOM
- Réagissez, modifiez le texte en double-clic