J'essaie d'utiliser React.forwardRef, mais je trébuche sur la façon de le faire fonctionner dans un composant basé sur une classe (pas HOC).
Les exemples de documentation utilisent des éléments et des composants fonctionnels, et même des classes d'encapsulation dans des fonctions pour des composants d'ordre supérieur.
Donc, en commençant par quelque chose comme ça dans leur ref.js
fichier:
const TextInput = React.forwardRef(
(props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />)
);
et définissez-le plutôt comme quelque chose comme ceci:
class TextInput extends React.Component {
render() {
let { props, ref } = React.forwardRef((props, ref) => ({ props, ref }));
return <input type="text" placeholder="Hello World" ref={ref} />;
}
}
ou
class TextInput extends React.Component {
render() {
return (
React.forwardRef((props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />))
);
}
}
fonctionne uniquement: /
De plus, je sais que je sais, les arbitres ne sont pas la manière de réagir. J'essaie d'utiliser une bibliothèque de canevas tierce et j'aimerais ajouter certains de leurs outils dans des composants séparés, j'ai donc besoin d'écouteurs d'événements, j'ai donc besoin de méthodes de cycle de vie. Cela peut emprunter une autre voie plus tard, mais je veux essayer ceci.
La documentation dit que c'est possible!
Le transfert de référence n'est pas limité aux composants DOM. Vous pouvez également transmettre des références aux instances de composant de classe.
à partir de la note de cette section.
Mais ensuite, ils utilisent des HOC au lieu de simples classes.
la source
connect
ou marterial-uiwithStyles
?connect
ouwithStyles
? Vous devez envelopper tous les HOC avecforwardRef
et utiliser en interne un accessoire "sûr" pour passer une référence au composant le plus bas de la chaîne.Vous devez utiliser un nom de prop différent pour transmettre la référence à une classe.
innerRef
est couramment utilisé dans de nombreuses bibliothèques.la source
beautifulInputElement
est plus une fonction qu'un élément de réaction, ça devrait être comme çaconst beautifulInputElement = <BeautifulInputForwardingRef ref={ref => ref && ref.focus()} />
Fondamentalement, ce n'est qu'une fonction HOC. Si vous souhaitez l'utiliser avec la classe, vous pouvez le faire vous-même et utiliser des accessoires réguliers.
Ce modèle est utilisé par exemple dans
styled-components
et il y est appeléinnerRef
.la source
innerRef
manque complètement le point. Le but est une transparence totale: je devrais être capable de traiter un<FancyButton>
comme s'il s'agissait d'un élément DOM normal, mais en utilisant l'approche des composants stylisés, je dois me rappeler que ce composant utilise un accessoire nommé arbitrairement pour les références au lieu de simplementref
.innerRef
en faveur de la transmission de la référence à l'enfant qui utiliseReact.forwardRef
, ce que l'OP essaie d'accomplir.Cela peut être accompli avec un composant d'ordre supérieur, si vous le souhaitez:
Et puis dans votre fichier composant:
Je l' ai fait l'avance de travail avec des tests et publié un package pour cela,
react-with-forwarded-ref
: https://www.npmjs.com/package/react-with-forwarded-refla source
Si vous devez réutiliser cela dans de nombreux composants différents, vous pouvez exporter cette capacité vers quelque chose comme
withForwardingRef
usage:
la source