Eu sei que esta pergunta já foi feita algumas vezes, mas na maioria das vezes, a solução é lidar com isso no pai, pois o fluxo de responsabilidade é apenas decrescente. No entanto, às vezes, você precisa eliminar um componente de um de seus métodos. Eu sei que não posso modificar seus adereços, e se eu começar a adicionar booleanos como o estado, vai começar a ficar muito confuso para um componente simples. Aqui está o que estou tentando alcançar: um pequeno componente de caixa de erro, com um "x" para descartá-lo. Receber um erro por meio de seus adereços irá exibi-lo, mas gostaria de uma forma de fechá-lo a partir de seu próprio código.
class ErrorBoxComponent extends React.Component {
dismiss() {
// What should I put here?
}
render() {
if (!this.props.error) {
return null;
}
return (
<div data-alert className="alert-box error-box">
{this.props.error}
<a href="#" className="close" onClick={this.dismiss.bind(this)}>×</a>
</div>
);
}
}
export default ErrorBoxComponent;
E eu usaria assim no componente pai:
<ErrorBox error={this.state.error}/>
Na seção O que devo colocar aqui? , Já tentei:
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
O que gera um bom erro no console:
Aviso: unmountComponentAtNode (): o nó que você está tentando desmontar foi renderizado pelo React e não é um contêiner de nível superior. Em vez disso, faça com que o componente pai atualize seu estado e processe novamente para remover esse componente.
Devo copiar os adereços de entrada no estado ErrorBox e manipulá-los apenas internamente?
Respostas:
Assim como aquele belo aviso que você recebeu, você está tentando fazer algo que é um Antipadrão no React. Este é um não-não. O objetivo do React é que a desmontagem aconteça de um relacionamento de pai para filho. Agora, se você quiser que um filho se desmonte, pode simular isso com uma mudança de estado no pai que é acionada pelo filho. deixe-me mostrar em código.
este é um exemplo muito simples. mas você pode ver uma maneira difícil de passar para os pais uma ação
Dito isso, você provavelmente deve passar pela loja (ação de despacho) para permitir que sua loja contenha os dados corretos quando for renderizada
Eu fiz mensagens de erro / status para dois aplicativos separados, ambos passaram pela loja. É o método preferido ... Se você quiser, posso postar um código de como fazer isso.
EDIT: Aqui está como eu configuro um sistema de notificação usando React / Redux / Typescript
Algumas coisas a serem observadas primeiro. isso está no texto datilografado, então você precisa remover as declarações de tipo :)
Estou usando os pacotes npm lodash para operações e nomes de classe (cx alias) para atribuição de nome de classe em linha.
A beleza dessa configuração é que eu uso um identificador exclusivo para cada notificação quando a ação a cria. (por exemplo, id_notificação). Este ID exclusivo é um
Symbol()
. Dessa forma, se você quiser remover qualquer notificação a qualquer momento, você pode porque sabe qual delas remover. Este sistema de notificação permitirá que você empilhe quantos quiser e eles irão embora quando a animação for concluída. Estou me conectando ao evento de animação e, quando termina, aciono um código para remover a notificação. Também configurei um tempo limite de fallback para remover a notificação, caso o callback da animação não seja acionado.notificação-ações.ts
notificação-redutor.ts
app.tsx
na renderização de base para seu aplicativo, você renderizaria as notificações
user-notification.tsx
classe de notificação de usuário
fonte
ao invés de usar
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
tente usar
fonte
<div id="c1"><div id="c2"><div id="react-root" /></div></div>
. E se o texto interno dec1
for substituído?Na maioria dos casos, basta ocultar o elemento, por exemplo, desta forma:
Ou você pode renderizar / renderizar / não renderizar via componente pai como este
Finalmente, existe uma maneira de remover o nó html, mas eu realmente não sei se é uma boa ideia. Talvez alguém que conhece React from internal diga algo sobre isso.
fonte
Já estive neste post umas 10 vezes e só queria deixar meus dois centavos aqui. Você pode simplesmente desmontá-lo condicionalmente.
Tudo que você precisa fazer é removê-lo do DOM para desmontá-lo.
Contanto que
renderMyComponent = true
o componente seja renderizado. Se você definirrenderMyComponent = false
, ele será desmontado do DOM.fonte
Isso não é apropriado em todas as situações, mas você pode condicionalmente
return false
dentro do próprio componente se um determinado critério for ou não atendido.Não desmonta o componente, mas remove todo o conteúdo renderizado. Isso só seria ruim, em minha opinião, se você tiver ouvintes de eventos no componente que devem ser removidos quando o componente não for mais necessário.
fonte