J'ai initialisé l' i18n
objet de traduction une fois dans un composant (premier composant qui se charge dans l'application). Ce même objet est requis dans tous les autres composants. Je ne veux pas le réinitialiser dans chaque composant. Quel est le chemin? Le rendre disponible pour la portée de la fenêtre n'aide pas car je dois l'utiliser dans la render()
méthode.
Veuillez suggérer une solution générique pour ces problèmes et non une solution spécifique à i18n.
Redux
uneFlux
bibliothèque qui peut gérer des données ou un état globalement. et vous pouvez le passer facilement à travers tous vos composantsRéponses:
Pourquoi n'essayez-vous pas d'utiliser Context ?
Vous pouvez déclarer une variable de contexte globale dans n'importe lequel des composants parents et cette variable sera accessible dans l'arborescence des composants par
this.context.varname
. Vous n'avez qu'à spécifierchildContextTypes
etgetChildContext
dans le composant parent et par la suite vous pouvez utiliser / modifier cela à partir de n'importe quel composant en spécifiant simplementcontextTypes
dans le composant enfant.Cependant, veuillez en prendre note comme indiqué dans la documentation:
la source
Au-delà de React
Vous ne savez peut-être pas qu'une importation est déjà globale . Si vous exportez un objet (singleton), il est alors globalement accessible en tant qu'instruction d'importation et il peut également être modifié globalement .
Si vous souhaitez initialiser quelque chose globalement mais vous assurer qu'il n'est modifié qu'une seule fois, vous pouvez utiliser cette approche singleton qui a initialement des propriétés modifiables, mais vous pouvez ensuite l'utiliser
Object.freeze
après sa première utilisation pour garantir son immuable dans votre scénario d'initialisation.puis dans votre méthode init en le référençant:
Le
myInitObject
sera toujours global car il peut être référencé n'importe où en tant qu'importation mais restera figé et jeté si quelqu'un tente de le modifier.Si vous utilisez react-create-app
(ce que je cherchais en fait) Dans ce scénario, vous pouvez également initialiser proprement les objets globaux lors du référencement des variables d'environnement.
La création d'un fichier .env à la racine de votre projet avec des
REACT_APP_
variables préfixées à l'intérieur fait très bien. Vous pouvez référencer dans votre JS et JSXprocess.env.REACT_APP_SOME_VAR
selon vos besoins ET c'est immuable de par sa conception.Cela évite d'avoir à définir
window.myVar = %REACT_APP_MY_VAR%
en HTML.Voir plus de détails utiles à ce sujet directement sur Facebook:
https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables
la source
N'est pas recommandé mais .... vous pouvez utiliser componentWillMount de votre classe d'application pour ajouter vos variables globales à travers elle ... un peu comme ceci:
considérez toujours cela comme un hack ... mais cela fera votre travail
btw componentWillMount s'exécute une fois avant le rendu, voir plus ici: https://reactjs.org/docs/react-component.html#mounting-componentwillmount
la source
componentWillMount
c'est obsolète: reactjs.org/blog/2018/03/27/update-on-async-rendering.htmlCréez un fichier nommé "config.js" dans le dossier ./src avec ce contenu:
Dans votre fichier principal "index.js" mettez cette ligne:
Partout où vous avez besoin de votre objet, utilisez ceci:
la source
Peut conserver les variables globales dans Webpack, c'est-à-dire dans
webpack.config.js
Dans js, le module peut lire comme
J'espère que cela aidera.
la source
Le meilleur moyen que j'ai trouvé jusqu'à présent est d'utiliser React Context mais de l'isoler dans un composant fournisseur de haut niveau .
la source
Vous pouvez utiliser des mixins dans react https://facebook.github.io/react/docs/reusable-components.html#mixins .
la source
Voici une approche moderne, en utilisant
globalThis
, que nous avons adoptée pour notre application React Native .globalThis
est maintenant inclus dans ...appGlobals.ts
App.tsx ( notre fichier de point d'entrée principal )
anyWhereElseInTheApp.tsx
la source
Je ne sais pas ce qu'ils essaient de dire avec ce truc "React Context" - ils me parlent grec, mais voici comment je l'ai fait:
Transporter des valeurs entre les fonctions, sur la même page
Dans votre constructeur, liez votre setter:
Ensuite, déclarez une fonction juste en dessous de votre constructeur:
Lorsque vous souhaitez le configurer, appelez
this.setSomeVariable("some value");
(Vous pourrez peut-être même vous en sortir
this.state.myProperty = "some value";
)Lorsque vous voulez l'obtenir, appelez
var myProp = this.state.myProperty;
L'utilisation
alert(myProp);
devrait vous donnersome value
.Méthode d'échafaudage supplémentaire pour transmettre des valeurs à travers les pages / composants
Vous pouvez attribuer un modèle à
this
(techniquementthis.stores
), vous pouvez donc le référencer avecthis.state
:Enregistrer à un dossier appelé
stores
commeyourForm.jsx
.Ensuite, vous pouvez le faire dans une autre page:
Si vous aviez défini
this.state.someGlobalVariable
un autre composant en utilisant une fonction telle que:que vous liez dans le constructeur avec:
la valeur dans
propertyTextToAdd
serait affichée enSomePage
utilisant le code ci-dessus.la source