Minha estrutura é a seguinte:
Component 1
- |- Component 2
- - |- Component 4
- - - |- Component 5
Component 3
O componente 3 deve exibir alguns dados, dependendo do estado do componente 5. Como os objetos são imutáveis, não posso simplesmente salvar seu estado no componente 1 e encaminhá-lo, certo? E sim, eu li sobre redux, mas não quero usá-lo. Espero que seja possível resolvê-lo apenas com reagir. Estou errado?
<MyChildComponent setState={(s,c)=>{this.setState(s, c)}} />
se você vai usar esse hack, certifique-se de apoiar o retorno de chamada.this.setState(p)
? Eu tentei sem eles e parece funcionar (eu sou muito novo em reagir)Respostas:
Para comunicação entre pais e filhos, você deve passar uma função definindo o estado de pai para filho, como este
Dessa forma, o filho pode atualizar o estado dos pais com a chamada de uma função passada com adereços.
Mas você terá que repensar a estrutura de seus componentes, porque, como eu entendo, os componentes 5 e 3 não estão relacionados.
Uma solução possível é envolvê-los em um componente de nível superior que conterá o estado dos componentes 1 e 3. Esse componente definirá o estado de nível inferior por meio de adereços.
fonte
this.handler = this.handler.bind(this)
construtor,this
dentro dahandler
função fará referência ao fechamento da função, não à classe. Se não quiser vincular todas as suas funções no construtor, há mais duas maneiras de lidar com isso usando as funções de seta. Você pode simplesmente escrever o manipulador de cliques comoonClick={()=> this.setState(...)}
ou usar inicializadores de propriedades juntamente com funções de seta, conforme descrito aqui babeljs.io/blog/2015/06/07/react-on-es6-plus em "Funções de seta"Encontrei a seguinte solução de trabalho para transmitir o argumento da função onClick de child para o componente pai:
Versão com passagem de um método ()
Veja JSFIDDLE
Versão com passagem da função Arrow
Veja JSFIDDLE
fonte
<ChildB handleToUpdate = {handleToUpdate.bind(this)} />
por que teve que ligar novamente?this
for chamado dentro do filho,this
se refira ao estado do pai e não ao filho. Este é o melhor fechamento!Quero agradecer a resposta mais votada por me dar a idéia do meu próprio problema, basicamente a variação dele com a função de seta e a passagem de param do componente filho:
Espero que ajude alguém.
fonte
this
funções da seta in se referem ao contexto do pai (ou seja,Parent
classe).Eu gosto da resposta sobre a passagem de funções, é uma técnica muito útil.
Por outro lado, você também pode conseguir isso usando pub / sub ou usando uma variante, um despachante, como o Flux . A teoria é super simples, o componente 5 envia uma mensagem que o componente 3 está ouvindo. O componente 3 atualiza seu estado que aciona a nova renderização. Isso requer componentes com estado, que, dependendo do seu ponto de vista, podem ou não ser um antipadrão. Sou contra eles pessoalmente e prefiro que outra coisa esteja ouvindo despachos e alterações de estado de cima para baixo (o Redux faz isso, mas adiciona terminologia adicional).
O pacote do despachante com o Flux é muito simples, ele simplesmente registra retornos de chamada e os invoca quando ocorre qualquer despacho, passando pelo conteúdo do despacho (no exemplo resumido acima não há
payload
com o despacho, apenas um ID da mensagem). Você pode adaptar isso ao pub / sub tradicional (por exemplo, usando o EventEmitter de eventos ou alguma outra versão) com muita facilidade, se isso fizer mais sentido para você.fonte
var Dispatcher = require( 'flux' ).Dispatcher
Encontrei a seguinte solução de trabalho para transmitir o argumento da função onClick de child para o componente pai com param:
classe pai:
classe criança:
fonte
param1
é apenas exibir no console não conseguir atribuir-lhe sempre cessionáriostrue
Sempre que você precisar se comunicar entre os filhos e os pais em qualquer nível inferior, é melhor usar o contexto . No componente pai, defina o contexto que pode ser chamado pelo filho, como
você pode encontrar o projeto Demo no repo
fonte
Parece que só podemos passar dados de pai para filho quando a reação promove o fluxo de dados unidirecional, mas para fazer o pai atualizar-se quando algo acontece em seu "componente filho", geralmente usamos o que é chamado de "função de retorno de chamada".
Neste exemplo, podemos fazer com que os dados passem de SubChild -> Child -> Parent passando a função para seu filho direto.
fonte
Eu usei uma resposta mais bem avaliada nesta página muitas vezes, mas enquanto aprendia o React, encontrei uma maneira melhor de fazer isso, sem vincular e sem a função embutida dentro dos adereços.
Basta olhar aqui:
A chave está em uma função de seta:
Você pode ler mais aqui . Espero que isso seja útil para alguém =)
fonte
-Podemos criar ParentComponent e com o método handleInputChange para atualizar o estado ParentComponent. Importe o ChildComponent e passamos dois props do componente pai para o filho, ou seja, a função e a contagem de handleInputChange.
Agora criamos o arquivo ChildComponent e salvamos como ChildComponent.jsx. Este componente é sem estado porque o componente filho não possui um estado. Usamos a biblioteca prop-types para verificar o tipo de adereços.
fonte
Se esse mesmo cenário não estiver espalhado em todos os lugares, você poderá usar o contexto do React, especialmente se não desejar introduzir toda a sobrecarga que as bibliotecas de gerenciamento de estado apresentam. Além disso, é mais fácil aprender. Mas tenha cuidado, você pode usá-lo demais e começar a escrever códigos incorretos. Basicamente, você define um componente Container (que manterá e manterá esse estado para você), tornando todos os componentes interessados em escrever / ler esses dados em seus filhos (não necessariamente filhos diretos)
https://reactjs.org/docs/context.html
Você também pode usar o React comum corretamente.
passar doSomethingAbout5 até o Componente 1
Se esse é um problema comum, você deve começar a pensar em mudar todo o estado do aplicativo para outro lugar. Você tem algumas opções, as mais comuns são:
https://redux.js.org/
https://facebook.github.io/flux/
Basicamente, em vez de gerenciar o estado do aplicativo em seu componente, você envia comandos quando algo acontece para atualizar o estado. Os componentes extraem o estado desse contêiner também para que todos os dados sejam centralizados. Isso não significa que não é mais possível usar o estado local, mas esse é um tópico mais avançado.
fonte
então, se você deseja atualizar o componente pai,
Aqui onChange é um atributo com o método "manipulador" vinculado à sua instância. passamos o manipulador de método para o componente da classe Child, para receber via propriedade onChange em seu argumento props.
O atributo onChange será definido em um objeto de props como este:
e passado para o componente filho
Portanto, o componente Filho pode acessar o valor do nome no objeto props como este props.onChange
É feito através do uso de render adereços.
Agora, o componente Filho possui um botão "Clique" com um evento onclick definido para chamar o método manipulador passado a ele via onChnge em seu objeto de argumento props. Portanto, agora this.props.onChange in Child mantém o método de saída na classe Parent Reference e créditos: Bits and Pieces
fonte
É assim que eu faço.
fonte
A maioria das respostas dadas acima é para projetos baseados em React.Component. Se você estiver usando
useState
as atualizações recentes da biblioteca React, siga esta respostafonte
fonte