Correct façon de partager des fonctions entre les composants de Réagir
J'ai plusieurs composants qui ont tous besoin de faire la même chose. (Une fonction simple qui cartes au-dessus de leur enfant composants et fait quelque chose pour chacun). Pour le moment, je suis à la définition de cette méthode dans chacune des composantes. Mais je ne veux définir qu'une seule fois.
Je pourrais la définir dans le haut niveau composant et puis le transmettre comme un accessoire. Mais qui ne se sentent pas tout à fait droit. C'est plus une fonction de la bibliothèque qu'un accessoire. (Il me semble).
Quelle est la façon correcte de le faire?
- Découvrez ce lien. Ou de la recherche pour "mixin" et "ad HOC" dans google.
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez quelque chose comme browserify, alors vous pouvez avoir un fichier externe, j'.e util.js que les exportations de certaines fonctions de l'utilitaire.
Alors besoin de besoin, il faut
Voici quelques exemples sur la façon dont vous pouvez réutiliser une fonction (
FetchUtil.handleError
) dans une Réagir composant (App
).Solution 1: Utilisation de CommonJS module syntaxe
Solution 2: Utilisation de "createClass" React (v16)
util/FetchUtil.js
Remarque: Si vous utilisez Réagir v15.4 (ou ci-dessous), vous devez importer
createClass
comme suit:Source: https://reactjs.org/blog/2017/04/07/react-v15.5.0.html#migrating-from-reactcreateclass
Composant (qui réutilise FetchUtil)
composants/App.jsx
Une autre bonne option autre que la création d'un fichier util serait d'utiliser un ordre plus élevé composant pour créer un
withComponentMapper()
wrapper. Ce volet permettra de prendre dans un composant comme un paramètre et revenir en arrière avec lacomponentMapper()
fonction transmis comme un accessoire.Ceci est considéré comme une bonne pratique à Réagir. Vous pouvez trouver comment faire en détail ici.
Utils.js avec la dernière version de Javascript SE6 syntaxe
Créer le
Utils.js
fichier comme ceci avec de multiples fonctions, etcPuis dans votre composants que vous souhaitez utiliser le menu util fonctions, importation de fonctions spécifiques qui sont nécessaires. Vous n'avez pas à importer tout
Puis l'utilisation de ces fonctions au sein de la composante comme ceci:
Sonne comme une fonction d'utilité, dans ce cas, pourquoi ne pas le mettre dans un autre statique module d'utilitaire?
Sinon, si vous utilisez un transpiler comme Babel, vous pouvez faire usage de es7 de méthodes statiques:
Ou d'autre si vous utilisez Réagir.createClass vous pouvez utiliser le la statique objet:
Cependant, je ne conseille pas ces options, il n'est pas judicieux d'inclure un volet pour une méthode utilitaire.
Aussi vous ne devriez pas être en train de passer d'une méthode à toutes vos composants comme un accessoire, il sera étroitement couple et de faire du refactoring de plus en plus douloureux. Je vous conseille un bon vieux module d'utilitaire.
L'autre option est d'utiliser un mixin pour étendre la classe, mais je ne le recommande pas que vous ne pouvez pas le faire dans l'es6+ (et je ne vois pas l'intérêt dans ce cas).
React.createClass
est obsolète depuis Réagir 15.5.0. créer-réagir-app suggère l'utilisation de la ngp modulecreate-react-class
à la place.doSomething.js
, ou un fichier avec plusieurs similaires de "l'utilité" des fonctions par exempleutils.js
et d'importation de ces fonctions où vous avez besoin de les utiliserCela dépend du nombre de composants à la logique se rapportent les uns aux autres.
Si la logique est relativement liées (ils ne sont utilisés ensemble dans la même application), vous devez partager entre les composants. Mais si votre logique est lointainement liée à (c'est à dire, les mathématiques util, mise en forme de texte util), alors vous devriez faire et l'importation util fonctions de classe.
Relativement composantes connexes peut être créé avec rappel des références, comme cela, en
./components/App.js
...Et puis vous pouvez utilisation fonctions partagées entre eux comme ça...
Util-composants de type peut être créé comme cela, en
./utils/time.js
...Et ils peuvent alors être utilisé comme cela, en
./components/App.js
...Ne devriez-vous pas utiliser un Mixin pour cela ? Voir https://facebook.github.io/react/docs/reusable-components.html
Bien qu'ils sont en baisse à la faveur de voir https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750
Pourrait être utile
Si vous voulez manipuler l'état dans des fonctions d'assistance de suivre ce:
Créer un Helpers.js fichier:
export function myFunc(){
return this.state.name; //define it according to your needs
}
Importation fonction d'assistance dans votre fichier de composant:
import {myFunc} from 'path-to/Helpers.js'
Dans votre constructeur ajouter que la fonction d'assistance à la classe
constructor(){
this.myFunc = myFunc.bind(this)
}
Dans votre fonction rendu l'utiliser:
render(){
<div>{this.myFunc()}</div>
}