Inicialicé el i18n
objeto de traducción una vez en un componente (primer componente que se carga en la aplicación). Ese mismo objeto se requiere en todos los demás componentes. No quiero reinicializarlo en todos los componentes. ¿Qué hay alrededor? Ponerlo a disposición del alcance de la ventana no ayuda, ya que necesito usarlo en el render()
método.
Sugiera una solución genérica para estos problemas y no una solución específica de i18n.
Redux
oFlux
biblioteca que puede manejar datos o estado a nivel mundial. y puede pasarlo fácilmente a través de todos sus componentesRespuestas:
¿Por qué no intentas usar Context? ?
Puede declarar una variable de contexto global en cualquiera de los componentes principales y esta variable será accesible a través del árbol de componentes por
this.context.varname
. Solo tiene que especificarchildContextTypes
ygetChildContext
en el componente principal y, a partir de entonces, puede usar / modificar esto desde cualquier componente simplemente especificandocontextTypes
en el componente secundario.Sin embargo, tome nota de esto como se menciona en los documentos:
fuente
Más allá de React
Es posible que no sepa que una importación ya es global . Si exporta un objeto (singleton), será accesible globalmente como una declaración de importación y también se puede modificar globalmente .
Si desea inicializar algo globalmente pero asegurarse de que solo se modifique una vez, puede usar este enfoque singleton que inicialmente tiene propiedades modificables, pero luego puede usarlo
Object.freeze
después de su primer uso para asegurarse de que sea inmutable en su escenario de inicio.luego en su método init haciendo referencia a él:
El
myInitObject
todavía será global, ya que puede ser referenciado en cualquier lugar como una importación pero se mantendrá congelada y tirar si los intentos que cualquiera pueda modificarlo.Si usa react-create-app
(lo que estaba buscando en realidad) En este escenario, también puede inicializar objetos globales limpiamente al hacer referencia a variables de entorno.
La creación de un archivo .env en la raíz de su proyecto con
REACT_APP_
variables prefijadas en el interior funciona bastante bien. Puede hacer referencia dentro de su JS y JSXprocess.env.REACT_APP_SOME_VAR
según lo necesite Y es inmutable por diseño.Esto evita tener que configurar
window.myVar = %REACT_APP_MY_VAR%
en HTML.Vea más detalles útiles sobre esto directamente desde Facebook:
https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables
fuente
No se recomienda, pero ... puedes usar componentWillMount de tu clase de aplicación para agregar tus variables globales a través de ella ... un poco así:
aún considero esto un truco ... pero hará tu trabajo
Por cierto, componentWillMount se ejecuta una vez antes de renderizar, vea más aquí: https://reactjs.org/docs/react-component.html#mounting-componentwillmount
fuente
componentWillMount
está en desuso: reactjs.org/blog/2018/03/27/update-on-async-rendering.htmlCree un archivo llamado "config.js" en la carpeta ./src con este contenido:
En su archivo principal "index.js" ponga esta línea:
Donde sea que necesite su objeto use esto:
fuente
Puede mantener variables globales en el paquete web, es decir, en
webpack.config.js
En el módulo js se puede leer como
Espero que esto ayude.
fuente
La mejor manera que he encontrado hasta ahora es usar React Context pero aislarlo dentro de un componente de proveedor de orden superior .
fuente
Puede usar mixins en react https://facebook.github.io/react/docs/reusable-components.html#mixins .
fuente
Aquí hay un enfoque moderno que
globalThis
usamos para nuestra aplicación React Native .globalThis
ahora está incluido en ...appGlobals.ts
App.tsx ( nuestro archivo de punto de entrada principal )
anyWhereElseInTheApp.tsx
fuente
No sé qué están tratando de decir con estas cosas de "Reaccionar contexto"; me están hablando en griego, pero así es como lo hice:
Llevando valores entre funciones, en la misma página
En su constructor, vincule su setter:
Luego declara una función justo debajo de tu constructor:
Cuando quieras configurarlo, llama
this.setSomeVariable("some value");
(Incluso podrías salirte con la tuya
this.state.myProperty = "some value";
)Cuando quieras conseguirlo, llama
var myProp = this.state.myProperty;
El uso
alert(myProp);
debería dartesome value
.Método de andamio adicional para transportar valores a través de páginas / componentes
Puede asignar un modelo a
this
(técnicamentethis.stores
), por lo que luego puede referenciarlo conthis.state
:Guarde esto en una carpeta llamada
stores
comoyourForm.jsx
.Entonces puedes hacer esto en otra página:
Si hubiera configurado
this.state.someGlobalVariable
otro componente usando una función como:que enlaza en el constructor con:
el valor en
propertyTextToAdd
se mostraríaSomePage
usando el código que se muestra arriba.fuente