Quelle est la manière la plus efficace de définir le focus sur un champ de texte particulier après le rendu du composant?
La documentation semble suggérer l'utilisation de références, par exemple:
Définissez ref="nameInput"
sur mon champ de saisie dans la fonction de rendu, puis appelez:
this.refs.nameInput.getInputDOMNode().focus();
Mais où dois-je appeler cela? J'ai essayé quelques endroits mais je n'arrive pas à le faire fonctionner.
javascript
reactjs
Dave
la source
la source
<input>
élément. Quelque chose comme<input ref={ (component) => ReactDOM.findDOMNode(component).focus() } />
@ La réponse de Dhiraj est correcte, et pour plus de commodité, vous pouvez utiliser l'accessoire autoFocus pour qu'une entrée se concentre automatiquement lorsqu'elle est montée:
Notez que dans jsx c'est
autoFocus
(F majuscule) contrairement au vieux HTML simple qui est insensible à la casse.la source
autofocus
attribut non fiable HTML5 , il utilise enfocus()
react-dom
fait sur le montage DOM , il est donc assez fiable.Depuis React 0.15 , la méthode la plus concise est:
la source
Focus sur le montage
Si vous souhaitez simplement focaliser un élément lors de son montage (rendu initial), une simple utilisation de l'attribut autoFocus fera l'affaire.
Focus dynamique
pour contrôler le focus de manière dynamique, utilisez une fonction générale pour masquer les détails d'implémentation de vos composants.
React 16.8 + Composant fonctionnel - useFocus hook
Démo complète
Composants de classe React 16.3 + - useFocus
Démo complète
la source
(htmlElRef.current as any).focus()
et (2)return {htmlElRef, setFocus}
au lieu du tableau.useFocus
plusieurs éléments.useFocus
écrit en Typescript. gist.github.com/carpben/de968e377cbac0ffbdefe1ab56237573as const
vous avez), très pédagogiques!set
dans la deuxième position commeconst [inputRef, setInputFocus] = useFocus()
. Cela correspond à useState more. D'abord l'objet, puis le passeur de cet objetSi vous souhaitez simplement effectuer la mise au point automatique dans React, c'est simple.
Alors que si vous voulez juste savoir où mettre ce code, la réponse se trouve dans componentDidMount ().
v014.3
Lisez les documents de l'API ici: https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode
la source
F
! (Note à soi et aux autres, pas au répondeur).React 16.3 a ajouté un nouveau moyen pratique de gérer cela en créant une référence dans le constructeur du composant et en l'utilisant comme ci-dessous:
Pour plus de détails, vous pouvez consulter cet article sur le blog React.
Mise à jour:
À partir de React 16.8 , le
useRef
crochet peut être utilisé dans les composants de fonction pour obtenir le même résultat:la source
Je viens de rencontrer ce problème et
j'utilisereact15.0.115.0.2 et j'utilise la syntaxe ES6 et je n'ai pas tout à fait obtenu ce dont j'avais besoin des autres réponses depuis la version 15 supprimée il y a des semaines et certaines desthis.refs
propriétés ont été dépréciés et retirés .En général, ce dont j'avais besoin était:
J'utilise:
Focus sur le premier élément d'entrée
J'ai utilisé
autoFocus={true}
le premier<input />
sur la page de sorte que lorsque le composant sera monté, il se concentrera.Concentrez le premier élément d'entrée avec une erreur
Cela a pris plus de temps et était plus compliqué. Je garde le code qui n'est pas pertinent pour la solution par souci de concision.
Magasin / état Redux
J'ai besoin d'un état global pour savoir si je dois définir le focus et le désactiver quand il a été défini, donc je ne continue pas à redéfinir le focus lorsque les composants sont rendus (je vais utiliser
componentDidUpdate()
pour vérifier le réglage du focus. )Cela pourrait être conçu comme bon vous semble pour votre application.
Composant de conteneur
Le composant devra avoir le
resetfocus
propriété définie et un callBack pour effacer la propriété s'il finit par définir le focus sur lui-même.Notez également que j'ai organisé mes créateurs d'action dans des fichiers séparés, principalement en raison de mon projet est assez volumineux et je voulais les diviser en morceaux plus gérables.
Composant de présentation
Aperçu
L'idée générale est que chaque champ de formulaire qui pourrait avoir une erreur et être concentré doit se vérifier lui-même et s'il doit se concentrer sur lui-même.
Il y a une logique métier qui doit se produire pour déterminer si le champ donné est le bon champ pour définir le focus. Cela ne s'affiche pas car cela dépendra de l'application individuelle.
Lorsqu'un formulaire est soumis, cet événement doit définir l'indicateur de focus global
resetFocus
sur true. Puis, au fur et à mesure que chaque composant se met à jour, il verra qu'il doit vérifier s'il obtient le focus et si c'est le cas, répartir l'événement pour réinitialiser le focus afin que les autres éléments n'aient pas à continuer de vérifier.edit En remarque, j'avais ma logique métier dans un fichier "utilitaires" et je viens d'exporter la méthode et de l'appeler dans chaque
shouldfocus()
méthode.À votre santé!
la source
Les documents React ont maintenant une section pour cela. https://facebook.github.io/react/docs/more-about-refs.html#the-ref-callback-attribute
la source
autofocus
monter, je cherchais simplement l'élément pour rester concentré lors de la saisie d'une valeur. Cela a parfaitement fonctionné pour ce scénario. (en utilisant React 15)Ce n'est plus la meilleure réponse. À partir de la v0.13,
this.refs
peut ne pas être disponible avant APRÈScomponentDidMount()
exécution, dans certains cas étranges.Ajoutez simplement la
autoFocus
balise à votre champ de saisie, comme FakeRainBrigand l'a montré ci-dessus.la source
<input autofocus>
champs ne se comporteront pas bien<input>
rendu aprèsRéf. Commentaire de @ Dave sur la réponse de @ Dhiraj; une alternative consiste à utiliser la fonctionnalité de rappel de l'attribut ref sur l'élément en cours de rendu (après le premier rendu d'un composant):
Plus d'informations
la source
Uncaught TypeError: Cannot read property 'focus' of null
component && React.findDomNode...
. En savoir plus à ce sujet ici: facebook.github.io/react/docs/…C'est la bonne façon, la mise au point automatique. Lorsque vous utilisez le rappel au lieu de la chaîne comme valeur de référence, il est automatiquement appelé. Vous avez obtenu votre référence disponible sans avoir besoin de toucher le DOM en utilisant
getDOMNode
la source
Notez qu'aucune de ces réponses n'a fonctionné pour moi avec un composant MaterialField TextField . Par Comment définir le focus sur un MaterialUI TextField? J'ai dû sauter à travers quelques cerceaux pour que cela fonctionne:
la source
focus()
doit être retardé jusqu’à la fin de l’animation.Vous pouvez placer cet appel de méthode dans la fonction de rendu. Ou à l'intérieur de la méthode du cycle de vie,
componentDidUpdate
la source
Vous n'avez pas besoin
getInputDOMNode
?? dans ce cas...Obtenez simplement le
ref
etfocus()
quand le composant est monté - componentDidMount ...la source
La mise au point automatique a fonctionné le mieux pour moi. J'avais besoin de changer du texte en une entrée avec ce texte lors d'un double clic, c'est donc ce que j'ai fini avec:
REMARQUE: pour résoudre le problème où React place le curseur au début du texte, utilisez cette méthode:
Trouvé ici: https://coderwall.com/p/0iz_zq/how-to-put-focus-at-the-end-of-an-input-with-react-js
la source
J'ai le même problème mais j'ai aussi une animation, donc mon collègue suggère d'utiliser window.requestAnimationFrame
c'est l'attribut ref de mon élément:
la source
Devrait être
la source
La réponse la plus simple est d'ajouter le ref = "un nom" dans l'élément de texte d'entrée et d'appeler la fonction ci-dessous.
la source
Pour déplacer le focus vers un élément nouvellement créé, vous pouvez stocker l'ID de l'élément dans l'état et l'utiliser pour définir
autoFocus
. par exempleDe cette façon, aucune des zones de texte ne se concentre sur le chargement de la page (comme je le souhaite), mais lorsque vous appuyez sur le bouton "Ajouter" pour créer un nouvel enregistrement, ce nouvel enregistrement obtient le focus.
Étant donné
autoFocus
que "ne s'exécute" plus à moins que le composant ne soit remonté, je n'ai pas besoin de dérangerthis.state.focus
(c'est-à-dire qu'il ne continuera pas à voler le focus lorsque je mettrai à jour d'autres états).la source
Lisez presque toute la réponse mais n'en voyez pas
getRenderedComponent().props.input
Définissez vos références de saisie de texte
this.refs.username.getRenderedComponent().props.input.onChange('');
la source
Après avoir essayé beaucoup d'options ci-dessus sans succès, j'ai constaté que c'était comme je l'étais
disabling
, puisenabling
l'entrée qui a causé la perte de la concentration.J'avais un accessoire
sendingAnswer
qui désactiverait l'entrée pendant que je sondais le backend.Une fois que j'ai supprimé l'accessoire désactivé, tout a recommencé à fonctionner.
la source
Version mise à jour que vous pouvez consulter ici
la source
Comme il y a beaucoup de raisons à cette erreur, j'ai pensé que je publierais également le problème auquel j'étais confronté. Pour moi, le problème est que j'ai rendu mes entrées en tant que contenu d'un autre composant.
Voici comment j'ai appelé le composant ci-dessus:
la source
Selon la syntaxe mise à jour, vous pouvez utiliser
this.myRref.current.focus()
la source