Si vous utilisez React 16.3+, la méthode suggérée pour créer des références est d'utiliser React.createRef()
.
class TestApp extends React.Component<AppProps, AppState> {
private stepInput: React.RefObject<HTMLInputElement>;
constructor(props) {
super(props);
this.stepInput = React.createRef();
}
render() {
return <input type="text" ref={this.stepInput} />;
}
}
Lorsque le composant est monté, la propriété de l' ref
attribut current
sera affectée au composant / élément DOM référencé et null
réattribuée lors de son démontage. Ainsi, par exemple, vous pouvez y accéder en utilisantthis.stepInput.current
.
Pour en savoir plus RefObject
, consultez la réponse de @ apieceofbart ou le PR a createRef()
été ajouté.
Si vous utilisez une version antérieure de React (<16.3) ou avez besoin d'un contrôle plus fin sur le moment où les références sont définies et non définies, vous pouvez utiliser des «références de rappel» .
class TestApp extends React.Component<AppProps, AppState> {
private stepInput: HTMLInputElement;
constructor(props) {
super(props);
this.stepInput = null;
this.setStepInputRef = element => {
this.stepInput = element;
};
}
render() {
return <input type="text" ref={this.setStepInputRef} />
}
}
Lorsque le composant est monté, React appellera le ref
rappel avec l'élément DOM, et l'appellera avec null
lors du démontage. Ainsi, par exemple, vous pouvez y accéder simplement en utilisant this.stepInput
.
En définissant le ref
rappel comme une méthode liée sur la classe par opposition à une fonction en ligne (comme dans une version précédente de cette réponse), vous pouvez éviter que le rappel soit appelé deux fois lors des mises à jour.
Il y avait une API où l' ref
attribut était une chaîne (voir la réponse d'Akshar Patel ), mais en raison de certains problèmes , les références de chaîne sont fortement déconseillées et seront éventuellement supprimées.
Édité le 22 mai 2018 pour ajouter la nouvelle façon de faire des refs dans React 16.3. Merci @apieceofbart d'avoir souligné qu'il y avait une nouvelle façon.
refs
attribut de classe seront obsolètes dans les prochaines versions de React.Une façon (ce que j'ai fait ) est de configurer manuellement:
alors vous pouvez même envelopper cela dans une fonction getter plus agréable (par exemple ici ):
la source
any
n'est évidemment pas obligatoire ici. La plupart des exemples que je vois utiliserHTMLInputElement
. Indiquant simplement l'évidence, mais si votre référence est sur un composant React (c'est-à-direPeoplePicker
), vous pouvez utiliser ce composant comme type pour obtenir des typages.Depuis React 16.3, la façon d'ajouter des refs est d'utiliser React.createRef comme Jeff Bowen l'a indiqué dans sa réponse. Cependant, vous pouvez profiter de Typescript pour mieux saisir votre référence.
Dans votre exemple, vous utilisez ref sur l'élément d'entrée. Donc, la façon dont je le ferais est:
En faisant cela, lorsque vous souhaitez utiliser cette référence, vous avez accès à toutes les méthodes d'entrée:
Vous pouvez également l'utiliser sur des composants personnalisés:
et ensuite avoir, par exemple, accès aux accessoires:
la source
EDIT: Ce n'est plus la bonne façon d'utiliser les refs avec Typescript. Regardez la réponse de Jeff Bowen et votez pour augmenter sa visibilité.
J'ai trouvé la réponse au problème. Utilisez les références comme ci-dessous à l'intérieur de la classe.
Merci @basarat pour avoir pointé dans la bonne direction.
la source
Property 'stepInput' does not exist on type '{ [key: string]: Component<any, any> | Element; }'
, en essayant d'accéderthis.refs.stepInput
.refs
objet n'avait que l'[key: string]
entrée.React.createRef
(composants de classe)Remarque: Omettre l'ancienne API héritée de String Refs ici ...
Références en lecture seule pour les nœuds DOM: Refs mutables pour les valeurs stockées arbitraires:React.useRef
(Crochets / composants de fonction)Remarque: ne pas initialiser
useRef
avecnull
dans ce cas. Cela ferait lerenderCountRef
typereadonly
(voir exemple ). Si vous devez fournirnull
une valeur initiale, procédez comme suit:Références de rappel (fonctionne pour les deux)
Échantillon de terrain de jeu
la source
useRef() as MutableRefObject<HTMLInputElement>
etuseRef<HTMLInputElement>(null)
?current
propriété deMutableRefObject<HTMLInputElement>
peut être modifiée, alors queuseRef<HTMLInputElement>(null)
crée unRefObject
typecurrent
marqué commereadonly
. Le premier peut être utilisé si vous avez besoin de modifier vous-même les nœuds DOM actuels dans les refs, par exemple en combinaison avec une bibliothèque externe. Il peut également être écrit sansas
:useRef<HTMLInputElement | null>(null)
. Ce dernier est un meilleur choix pour les nœuds DOM gérés par React, comme utilisé dans la plupart des cas. React stocke les nœuds dans les refs eux-mêmes et vous ne voulez pas chercher à changer ces valeurs.Si vous utilisez
React.FC
, ajoutez l'HTMLDivElement
interface:Et utilisez-le comme suit:
la source
Pour utiliser le style de rappel ( https://facebook.github.io/react/docs/refs-and-the-dom.html ) comme recommandé dans la documentation de React, vous pouvez ajouter une définition pour une propriété sur la classe:
la source
Faute d'un exemple complet, voici mon petit script de test pour obtenir les entrées de l'utilisateur lorsque vous travaillez avec React et TypeScript. Basé en partie sur les autres commentaires et ce lien https://medium.com/@basarat/strongly-typed-refs-for-react-typescript-9a07419f807#.cdrghertm
}
la source
Pour l'utilisateur dactylographié, aucun constructeur n'est requis.
...
...
la source
À partir de la définition de type React
Ainsi, vous pouvez accéder à votre élément refs comme suit
sans redéfinition de l'indice de référence.
Comme @manakor l'a mentionné, vous pouvez obtenir une erreur comme
si vous redéfinissez les références (dépend de la version IDE et ts que vous utilisez)
la source
Juste pour ajouter une approche différente - vous pouvez simplement lancer votre ref, quelque chose comme:
la source
Je fais toujours ça, dans ce cas pour attraper un ref
let input: HTMLInputElement = ReactDOM.findDOMNode<HTMLInputElement>(this.refs.input);
la source
Si vous ne souhaitez pas transférer votre
ref
, dans l'interface des accessoires, vous devez utiliser leRefObject<CmpType>
type deimport React, { RefObject } from 'react';
la source
Pour ceux qui cherchent comment le faire lorsque vous avez un tableau d'éléments:
la source
les mettre dans un objet
la source