Je souhaite appeler une méthode exposée par un composant React à partir de l'instance d'un élément React.
Par exemple, dans ce fichier jsfiddle . Je veux appeler la alertMessage
méthode à partir de la HelloElement
référence.
Existe-t-il un moyen d'y parvenir sans avoir à écrire des wrappers supplémentaires?
Edit (code copié de JSFiddle)
<div id="container"></div>
<button onclick="onButtonClick()">Click me!</button>
var onButtonClick = function () {
//call alertMessage method from the reference of a React Element! Something like HelloElement.alertMessage()
console.log("clicked!");
}
var Hello = React.createClass({displayName: 'Hello',
alertMessage: function() {
alert(this.props.name);
},
render: function() {
return React.createElement("div", null, "Hello ", this.props.name);
}
});
var HelloElement = React.createElement(Hello, {name: "World"});
React.render(
HelloElement,
document.getElementById('container')
);
Réponses:
Il existe deux manières d'accéder à une fonction interne. Un niveau d'instance, comme vous le souhaitez, un autre niveau statique.
Exemple
Vous devez appeler la fonction au retour de
React.render
. Voir ci-dessous.Statique
Jetez un œil à ReactJS Statics . Notez, cependant, qu'une fonction statique ne peut pas accéder aux données au niveau de l'instance, ce
this
serait le casundefined
.Alors fais
HelloRendered.alertMessage()
.la source
ref
qui est une fonction appelée avec l'instance en tant que paramètre. Cela vous permet également d'accéder à des objets qui ne sont pas au niveau supérieur, par exemple si vous effectuez un rendu,<MuiThemeProvider><Hello ref={setHelloRef} /></MuiThemeProvider>
vous obtenez la bonne référence transmise à votresetHelloRef
fonction plutôt qu'une àMuiThemeProvider
.Tu peux faire comme
Maintenant de l'extérieur de ce composant, vous pouvez appeler comme ceci ci-dessous
la source
J'ai fait quelque chose comme ça:
Et puis ailleurs:
Je n'ai pas testé ce code exact, mais c'est dans le sens de ce que j'ai fait dans un de mes projets et cela fonctionne bien :). Bien sûr, c'est un mauvais exemple, vous devriez simplement utiliser des accessoires pour cela, mais dans mon cas, le sous-composant a fait un appel d'API que je voulais garder à l'intérieur de ce composant. Dans un tel cas, c'est une bonne solution.
la source
this.cowCallbacks.say('moo')
this
à callback (qui sera une instance de Cow) au lieu decallbacks
.La
render
méthode rendant potentiellement obsolète la valeur renvoyée, l'approche recommandée consiste maintenant à attacher une référence de rappel à l'élément racine. Comme ça:auquel nous pouvons ensuite accéder en utilisant window.helloComponent, et n'importe laquelle de ses méthodes est accessible avec window.helloComponent.METHOD.
Voici un exemple complet:
la source
ref={component => {this.setState({ helloComponent: component; })}}
Ensuite, dans le gestionnaire de clic ...this.state.helloComponent.alertMessage();
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?
et cela ne lie pas le composant à la fenêtreVous pouvez appeler cette méthode depuis la fenêtre en utilisant
window.alertMessage()
.la source
Si vous êtes dans ES6, utilisez simplement le mot-clé "static" sur votre méthode de votre exemple serait le suivant:
static alertMessage: function() { ...
},
L'espoir peut aider n'importe qui là-bas :)
la source
Vous pouvez simplement ajouter un
onClick
gestionnaire au div avec la fonction (onClick
c'est la propre implémentation de ReactonClick
) et vous pouvez accéder à la propriété entre{ }
accolades, et votre message d'alerte apparaîtra.Si vous souhaitez définir des méthodes statiques qui peuvent être appelées sur la classe de composant, vous devez utiliser la statique. Bien que:
"Les méthodes définies dans ce bloc sont statiques, ce qui signifie que vous pouvez les exécuter avant la création de toute instance de composant et que les méthodes n'ont pas accès aux accessoires ou à l'état de vos composants. Si vous souhaitez vérifier la valeur des accessoires dans un fichier statique méthode, demandez à l'appelant de transmettre les accessoires en tant qu'argument de la méthode statique. " ( source )
Quelques exemples de code:
J'espère que cela vous aidera un peu, car je ne sais pas si j'ai bien compris votre question, alors corrigez-moi si je l'ai mal interprétée :)
la source
Il semble que la statique soit obsolète et que les autres méthodes d'exposition de certaines fonctions
render
semblent alambiquées. Pendant ce temps, cette réponse de Stack Overflow sur le débogage de React , bien que semblant hack-y, a fait le travail pour moi.la source
méthode 1
using ChildRef
:Méthode 2:
using window register
la source
Avec
React hook - useRef
Bonne chance...
la source
J'utilise cette méthode d'assistance pour rendre les composants et renvoyer une instance de composant. Des méthodes peuvent être appelées sur cette instance.
la source