findDOMNode
findDOMNode
trouve le nœud du navigateur pour une instance React à composant à base de classe.
const domNode = findDOMNode(componentInstance)
Référence
findDOMNode(componentInstance)
Appeler findDOMNode
pour trouver le nœud du navigateur pour une instance React à composant à base de classe donnée.
import { findDOMNode } from 'react-dom';
const domNode = findDOMNode(componentInstance);
Paramètres
componentInstance
: Une instance de la sous-classe duComponent
. Par exemplethis
dans un composant à base de classe.
Valeur renvoyée
findDOMNode
renvoie le plus proche nœud du DOM du navigateur dans une componentInstance
donnée. Lorsqu’un composant fait le rendu à null
, fait le rendu à false
, findDOMNode
renvoie null
. Lorsqu’un composant fait le rendu d’une string, findDOMNode
renvoie un nœud DOM sous forme de texte contenant cette valeur.
Limitations
-
Un composant peut renvoyer un tableau ou un Fragment avec plusieurs enfants. Dans ce cas
findDOMNode
, renverra le nœud du DOM correspondant au premier enfant non-vide. -
findDOMNode
fonctionne seulement sur les composants montés (c’est-à-dire, les composants qui ont été placés dans le DOM). Si vous essayez d’appelerthis
sur un composant qui n’a pas encore été monté (comme l’appel defindDOMNode()
dansrender()
sur un composant qui doit être crée), une exception sera levée. -
findDOMNode
renvoie seulement le résultat au moment de votre appel. Si un composant enfant fait plutard le rendu d’un nœud différent, vous n’avez aucun moyen d’être informé de ce changement. -
findDOMNode
accepte une instance de composant à base de classe, il ne peut être utilisé avec les fonctions composants.
Utilisation
Trouver le nœud racine du DOM d’un composant à base de classe
Appeler findDOMNode
avec une instance de composant à base de classe (généralement, this
) pour trouver le nœud du DOM qu’il a affiché.
class AutoselectingInput extends Component {
componentDidMount() {
const input = findDOMNode(this);
input.select()
}
render() {
return <input defaultValue="Bonjour" />
}
}
Ici, la variable de input
sera défini sur l’élément DOM <input>
. Cela vous permet de faire quelque chose avec. Par exemple, en cliquant « voir l’exemple » ci-dessous, le champ de saisi est monté, input.select()
sélectionne tout le text dans le champ :
import { Component } from 'react'; import { findDOMNode } from 'react-dom'; class AutoselectingInput extends Component { componentDidMount() { const input = findDOMNode(this); input.select() } render() { return <input defaultValue="Bonjour" /> } } export default AutoselectingInput;
Alternatives
Lecture du nœud DOM à partir d’une ref
Le code qui utilise findDOMNode
est fragile parce que la connection entre le nœud JSX et le code manipulant le nœud du DOM correspondant n’est pas explicite. Par exemple, essayez d’enrober ce <input />
dans un <div>
:
import { Component } from 'react'; import { findDOMNode } from 'react-dom'; class AutoselectingInput extends Component { componentDidMount() { const input = findDOMNode(this); input.select() } render() { return <input defaultValue="Bonjour" /> } } export default AutoselectingInput;
Le code sera interrompu maintenant, findDOMNode(this)
trouve le nœud <div>
du DOM, mais le code attend un nœud DOM <input>
. Pour éviter ce genre de problèmes, utilisez createRef
pour gérer un nœud DOM spécifique.
Dans cet exemple, findDOMNode
n’est plus utilisé. Par contre, inputRef = createRef(null)
est défini comme champ d’instance de la classe. Pour lire le nœud du DOM à partir de celui-ci, vous pouvez utiliser this.inputRef.current
. Pour le rattacher au JSX, vous faites le rendu <input ref={this.inputRef} />
. Cela connecte le code utilisant le nœud DOM à son JSX :
import { createRef, Component } from 'react'; class AutoselectingInput extends Component { inputRef = createRef(null); componentDidMount() { const input = this.inputRef.current; input.select() } render() { return ( <input ref={this.inputRef} defaultValue="Bonjour" /> ); } } export default AutoselectingInput;
Dans les versions modernes de React sans les composants à base de classe, le code équivalent appelerait useRef
à la place :
import { useRef, useEffect } from 'react'; export default function AutoselectingInput() { const inputRef = useRef(null); useEffect(() => { const input = inputRef.current; input.select(); }, []); return <input ref={inputRef} defaultValue="Bonjour" /> }
En savoir plus sur la manipulation du DOM avec les refs.
Lecture d’un nœud DOM d’un composant enfant à partir d’un ref transmis
Dans cet exemple, findDOMNode(this)
trouve un nœud DOM qui appartient à un autre composant. Le composant AutoselectingInput
fait le rendu de MyInput
, qui est votre propre composant qui affiche un navigateur <input>
.
import { Component } from 'react'; import { findDOMNode } from 'react-dom'; import MyInput from './MyInput.js'; class AutoselectingInput extends Component { componentDidMount() { const input = findDOMNode(this); input.select() } render() { return <MyInput />; } } export default AutoselectingInput;
Notez que l’appel de findDOMNode(this)
à l’intérieur de AutoselectingInput
vous donne toujours le DOM <input>
- même si le JSX de ce <input>
est masqué à l’intérieur du composant MyInput
. Cela semble pratique dans l’exemple ci-dessus, mais il conduit à un code fragile. Imaginez que vous voulez modifier MyInput
plutard et l’enrober autour d’un <div>
. Cela ne respectera pas le code de AutoselectingInput
(qui attend de trouver un <input>
).
Pour remplacer findDOMNode
dans cet exemple, les deux composants doivent être coordonnés :
AutoSelectingInput
doit déclarer un ref, comme dans l’exemple précédent, et le founir à<MyInput>
.MyInput
doit être déclaré avecforwardRef
pour prendre ce ref et le transmettre au nœud<input>
.
C’est ce que fait cette version, qui n’a donc plus besoin de findDOMNode
:
import { createRef, Component } from 'react'; import MyInput from './MyInput.js'; class AutoselectingInput extends Component { inputRef = createRef(null); componentDidMount() { const input = this.inputRef.current; input.select() } render() { return ( <MyInput ref={this.inputRef} /> ); } } export default AutoselectingInput;
Voici à quoi ressemblerait ce code avec les fonctions composants au lieu de classes :
import { useRef, useEffect } from 'react'; import MyInput from './MyInput.js'; export default function AutoselectingInput() { const inputRef = useRef(null); useEffect(() => { const input = inputRef.current; input.select(); }, []); return <MyInput ref={inputRef} defaultValue="Bonjour" /> }
Ajout d’un élement <div>
enrobant
Souvent un composant a besoin de connaître la position et la taille de ses enfants. Il est donc tentant de trouver l’enfant avec findDOMNode(this)
, et utiliser la méthode du DOM comme getBoundingClientRect
pour des mesures.
Il n’existe actuellement aucun équivalent direct pour ce cas d’utilisation, c’est pourquoi findDOMNode
est déprécié mais n’a pas encore été retiré complètement de React. En attendant, vous pouvez essayez d’afficher un nœud <div>
enrobant le contenu comme solution de contournement, et d’obtenir un ref à ce nœud. Cependant, les enveloppes supplémentaires peuvent nuire à la stylisation.
<div ref={someRef}>
{children}
</div>
Cela s’applique également à la focalisation et au défilement vers des enfants arbitraires.