Ocasionalmente, tenho componentes de reação que são conceitualmente ativos e que desejo redefinir. O comportamento ideal seria equivalente a remover o componente antigo e reler um novo componente original.
React fornece um método setState
que permite definir o próprio estado explícito dos componentes, mas que exclui o estado implícito, como o foco do navegador e o estado do formulário, e também exclui o estado de seus filhos. Pegar todo esse estado indireto pode ser uma tarefa complicada, e eu prefiro resolvê-lo rigorosa e completamente, em vez de jogar o golpe-a-toupeira a cada novo estado surpreendente.
Existe uma API ou padrão para fazer isso?
Edit: Eu fiz um exemplo trivial demonstrando a this.replaceState(this.getInitialState())
abordagem e contrastando-o com a this.setState(this.getInitialState())
abordagem: jsfiddle - replaceState
é mais robusto.
key
neste caso.)replaceState()
egetInitialState()
estão ambos obsoletos nas novas reactjs de estilo de classe ES6. Use em seuthis.setState(this._getInitialState())
lugar. Além disso, você não pode nomear sua própria função inicializadora de estadogetInitialState()
- react lança um aviso - chame-a de qualquer outra coisa e faça explicitamentestate = this._getInitialState()
no nível superior da classe.Você deve realmente evitar
replaceState
e usar em seusetState
lugar.Os documentos dizem que
replaceState
"pode ser totalmente removido em uma versão futura do React." Eu acho que definitivamente será removido porquereplaceState
realmente não combina com a filosofia do React. Facilita fazer um componente React começar a parecer uma espécie de faca suíça. Isso prejudica o crescimento natural de um componente React, tornando-se menor e mais específico.No React, se você tem que errar na generalização ou na especialização: busque a especialização. Como corolário, a árvore de estado para o seu componente deve ter uma certa parcimônia (é bom quebrar essa regra de bom gosto se você estiver construindo um produto novo em folha).
De qualquer forma, é assim que você faz. Semelhante à resposta de Ben (aceita) acima, mas assim:
Além disso (como Ben também disse), para redefinir o "estado do navegador", você precisa remover esse nó DOM. Aproveite o poder do vdom e use um novo
key
suporte para esse componente. A nova renderização substituirá esse componente no atacado.Referência: https://facebook.github.io/react/docs/component-api.html#replacestate
fonte
this.replaceState
? Porque é.getInitialState()
(digamos, em um manipulador onClick). Nesse caso, essa nova propriedade ainda estaria presente após o 2ºgetInitialState()
.getInitialState
. Muito parecido com declarar todas as suas variáveis em uma função JS no topo da função. Nota lateral: a solução de Ben Alpert é quase idêntica à minha ... e ele é um mantenedor oficial do React!Adicionar um
key
atributo ao elemento que você precisa reinicializar irá recarregá-lo toda vez queprops
ou sestate
associar ao elemento mudar.Aqui está um exemplo:
fonte