Inicializei o i18n
objeto de tradução uma vez em um componente (primeiro componente que carrega no aplicativo). Esse mesmo objeto é necessário em todos os outros componentes. Não quero reinicializá-lo em todos os componentes. Qual é o caminho? Torná-lo disponível para o escopo da janela não ajuda, pois preciso usá-lo no render()
método.
Por favor, sugira uma solução genérica para esses problemas e não uma solução específica para i18n.
reactjs
javascript-globalize
ensopado
fonte
fonte
Redux
ouFlux
biblioteca que pode lidar com dados ou estado globalmente. e você pode passá-lo facilmente por todos os seus componentesRespostas:
Por que você não tenta usar Context ?
Você pode declarar uma variável de contexto global em qualquer um dos componentes pai e essa variável estará acessível na árvore de componentes por
this.context.varname
. Você só precisa especificarchildContextTypes
egetChildContext
no componente pai e, a partir daí, pode usar / modificar isso de qualquer componente, apenas especificandocontextTypes
no componente filho.No entanto, observe isso conforme mencionado nos documentos:
fonte
Beyond React
Você pode não estar ciente de que uma importação já é global . Se você exportar um objeto (singleton), ele ficará acessível globalmente como uma instrução de importação e também poderá ser modificado globalmente .
Se você deseja inicializar algo globalmente, mas garantir que seja modificado apenas uma vez, você pode usar essa abordagem singleton que inicialmente tem propriedades modificáveis, mas você pode usar
Object.freeze
após seu primeiro uso para garantir que seja imutável em seu cenário de inicialização.então em seu método init referenciando-o:
O
myInitObject
ainda será global, pois pode ser referenciado em qualquer lugar como uma importação mas permanecerá congelado e lançado se alguém tentar modificá-lo.Se estiver usando react-create-app
(o que eu estava procurando na verdade) Neste cenário, você também pode inicializar objetos globais de forma limpa ao fazer referência a variáveis de ambiente.
Criar um arquivo .env na raiz do seu projeto com
REACT_APP_
variáveis prefixadas dentro faz muito bem. Você pode fazer referência em seu JS e JSXprocess.env.REACT_APP_SOME_VAR
conforme necessário E é imutável por design.Isso evita ter que definir
window.myVar = %REACT_APP_MY_VAR%
em HTML.Veja mais detalhes úteis sobre isso diretamente do Facebook:
https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables
fonte
Não é recomendado, mas ... você pode usar o componentWillMount de sua classe de aplicativo para adicionar suas variáveis globais através dele ... um pouco assim:
ainda considere isso um hack ... mas fará seu trabalho
btw componentWillMount é executado uma vez antes da renderização, veja mais aqui: https://reactjs.org/docs/react-component.html#mounting-componentwillmount
fonte
componentWillMount
está sendo suspenso: reactjs.org/blog/2018/03/27/update-on-async-rendering.htmlCrie um arquivo chamado "config.js" na pasta ./src com este conteúdo:
No seu arquivo principal "index.js" coloque esta linha:
Onde quer que você precise do seu objeto, use isto:
fonte
Pode manter variáveis globais em webpack, ou seja, em
webpack.config.js
No módulo js pode ler como
Espero que isso ajude.
fonte
A melhor maneira que encontrei até agora é usar o React Context, mas isolá-lo dentro de um componente de provedor de alta ordem .
fonte
Você pode usar mixins em react https://facebook.github.io/react/docs/reusable-components.html#mixins .
fonte
Aqui está uma abordagem moderna, usando
globalThis
, que usamos para nosso aplicativo React Native .globalThis
agora está incluído em ...appGlobals.ts
App.tsx ( nosso arquivo de ponto de entrada principal )
anyWhereElseInTheApp.tsx
fonte
Não sei o que eles estão tentando dizer com essa coisa de "React Context" - eles estão falando grego, para mim, mas aqui está como eu fiz:
Carregando valores entre funções, na mesma página
Em seu construtor, vincule seu setter:
Em seguida, declare uma função logo abaixo do seu construtor:
Quando quiser configurá-lo, ligue
this.setSomeVariable("some value");
(Você pode até ser capaz de escapar impune
this.state.myProperty = "some value";
)Quando você quiser pegar, ligue
var myProp = this.state.myProperty;
Usar
alert(myProp);
deve dar a vocêsome value
.Método de andaime extra para transportar valores entre páginas / componentes
Você pode atribuir um modelo a
this
(tecnicamentethis.stores
), para que possa referenciá-lo comthis.state
:Guardar esta para uma pasta chamada
stores
comoyourForm.jsx
.Então você pode fazer isso em outra página:
Se você definiu
this.state.someGlobalVariable
em outro componente usando uma função como:que você vincula no construtor com:
o valor em
propertyTextToAdd
seria exibidoSomePage
usando o código mostrado acima.fonte