2017-09-26 2 views
0

J'ai un onClick accessoires dans un composant React qui contient les éléments suivants:Quel est l'équivalent javascript vanilla de _.bind de Lodash?

onClick={_.bind(this.callMe, this, argToPass)} 

Gardez à l'esprit, c'est un composant React qui utilise React.createClass, de sorte que les fonctions des composants devrait être lié à sa le contexte.

Malheureusement, lorsque je tente de lier ce en procédant comme suit:

onClick={this.callMe(argToPass)} 

Il casse un de mes tests.

Je ne veux pas lier comme il est passé comme des accessoires comme ceci:

onClick={this.callMe(argToPass).bind(this)} 

b/c des problèmes de performance.

Quelle est la vanille javascript équivalent de:

_.bind(this.callMe, this, argToPass) 

qui permettra à la fonction de lier correctement.

Merci!

+0

Dude. Qui downvotes sans explication? C'est légitime, en production sur une équipe fantastique, et une vraie question. –

+0

_Je ne veux pas le lier via: 'this.callMe (argToPass) .bind (this)' b/c de problèmes de performance._ - Vous voulez dire parce que ce n'est pas correct? Parce qu'à moins que 'this.callMe()' renvoie une fonction, cela ne ferait que renvoyer une erreur, mais même si c'était le cas, vous auriez toujours un bug. ** Avis ** Je ne suis pas downvoted, je ne fais que commenter. –

+0

Il y a des problèmes de performances, et je ne veux pas lier la fonction au contexte de ce composant en utilisant cette notation. Ref ici: https://daveceddia.com/avoid-bind-when-passing-props/ –

Répondre

4

Le JS équivalent est Function#bind:

this.callMe.bind(this, argToPass) 

BTW - Je suggère d'éviter la liaison de la fonction dans les accessoires dans la phase de rendu. Vous pouvez en lire davantage dans Why shouldn't JSX props use arrow functions or bind?

+0

Je ne veux pas lier dans le onClick. Est-ce la même chose que this.callMe (argToPass) .bind (this)? –

+0

@zero_cool non ce n'est pas la même chose. Voir mon commentaire –

+1

Vous avez demandé l'équivalent de '_.bind()', et Function # bind c'est. La liaison en réaction est un sujet différent, et vous devriez vérifier le lien que j'ai ajouté à la réponse. –

0
onClick = {() => this.callMe(arrtopass)} 

ES6 Essayez de this.it de sentax.

+0

Aucun dé. Franche encore le test, mais j'apprécie les commentaires. –

0
import partial from 'lodash/partial' 

// bind using Function.bind 
onClick={partial(this.callMe.bind(this), argToPass)} 

// when binded in constructor or using arrow function 
onClick={partial(this.callMe, argToPass)} 
+0

Bien que cet extrait de code puisse être la solution, [y compris une explication] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) contribue vraiment à améliorer la qualité de votre message. Rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. –