Les Gestionnaires d'événements Réagir Apatrides Composants
Essayer de comprendre d'une manière optimale pour créer des gestionnaires d'événements dans Réagissent apatrides composants. Je pourrais faire quelque chose comme ceci:
const myComponent = (props) => {
const myHandler = (e) => props.dispatch(something());
return (
<button onClick={myHandler}>Click Me</button>
);
}
L'inconvénient étant qu'à chaque fois ce composant est affiché, une nouvelle "myHandler" fonction est créée. Est-il une meilleure façon de créer des gestionnaires d'événements dans apatrides composants qui peuvent toujours accéder aux propriétés du composant?
Vous devez vous connecter pour publier un commentaire.
L'application des gestionnaires d'éléments en fonction des composants doit généralement juste ressembler à ceci:
Si vous avez besoin de faire quelque chose de beaucoup plus complexe, c'est un signe que soit le composant ne doit pas être apatrides (utiliser une classe, ou crochets) ou b), vous devez être création du gestionnaire d'événements à l'extérieur de stateful composant conteneur.
Que d'un côté, et de saper mon premier point légèrement, sauf si le composant est dans un de manière particulièrement intense ré-rendu de l'appli il n'y a pas besoin de s'inquiéter à propos de la création de la flèche fonctions dans
render()
.À l'aide de la nouvelle Réagir crochets de fonctionnalité, il pourrait ressembler à quelque chose comme ceci:
useCallback
crée un memoised fonction, ce qui signifie une nouvelle fonction ne sera pas régénéré à chaque rendu de cycle.https://reactjs.org/docs/hooks-reference.html#usecallback
Cependant, cela est encore au stade de la proposition.
useCallback
- et vous êtes toujours à la génération d'une nouvelle flèche en fonction de chaque render (arg passé àuseCallback
).useCallback
n'est utile que lors du passage de rappels à l'optimisation de l'enfant composants que s'appuyer sur des références à l'égalité pour éviter de rend. Si vous êtes tout simplement l'application de la fonction de rappel d'un élément HTML comme le bouton, puis ne pas utiliseruseCallback
.Comment de cette façon :
<button onClick={(e) => props.dispatch(e,props.whatever)}>Click Me</button>
? Je veux dire, ne pas envelopper dans un myHandler la touche func.Si le gestionnaire s'appuie sur des propriétés qui changent, vous devez créer le gestionnaire à chaque fois puisque vous manque avec un état de l'instance sur laquelle à mettre en cache. Une autre alternative qui peut travailler serait de memoize le gestionnaire basé sur l'apport des accessoires.
Quelques options de mise en œuvre
lodash._memoize
R. memoize
rapide memoize
solution un mapPropsToHandler et de l'événement.cible.
les fonctions sont des objets js il est donc possible de les attacher des propriétés.
cette fonction ne lient une fois une propriété à une fonction.
Je ne reçois pas mes accessoires comme cela.
cet exemple, une combinaison des deux cas.cible et mapPropsToHandler. de son mieux pour attacher les fonctions de gestionnaires uniquement pas des nombres ou des chaînes de caractères. le nombre et les chaînes peuvent être transmis avec l'aide de DOM attribut comme
plutôt que mapPropsToHandler
solution deux. événement délégation
voir la solution. nous pouvons retirer le gestionnaire d'événement de l'entrée et de le mettre à son parent qui contient d'autres entrées de trop et par l'aide de la délégation technique, on peut utiliser l'événement.traget et mapPropsToHandler à nouveau la fonction.
Voici mes produits préférés de la liste de mises en œuvre à réagir et redux écrit en caractères d'imprimerie. Vous pouvez passer tous les arguments que vous avez besoin dans le gestionnaire personnalisé et de retour d'un nouveau
EventHandler
qui accepte de l'origine de l'événement argument. C'estMouseEvent
dans cet exemple.Isolé fonctions garder jsx cleaner et de l'empêcher de se briser en plusieurs peluchage règles. Comme
jsx-no-bind
,jsx-no-lambda
.Voici le bout de code javascript si vous n'êtes pas familier avec tapuscrit:
Si vous n'avez que quelques fonctions en vous des accessoires qui vous inquiète, vous pouvez le faire:
Si ça devient beaucoup plus compliqué, j'ai l'habitude de revenir en arrière pour avoir une classe de composant.
Après l'effort continu a finalement fonctionné pour moi.
Remarque: pour la zone de texte déposé liaison attribut "name" & "nom de la propriété" (e.g: modèle.nom) doit être la même alors, seulement "onInputTextChange" fonctionnera.
"onInputTextChange" logique peut être modifiée par votre code.
Comment quelque chose comme cela:
mais vraiment c'est trop si vous n'avez pas besoin de passer le onClick pour abaisser/éléments intérieurs, comme dans l'exemple.