Sé que esta pregunta ya se ha hecho un par de veces, pero la mayoría de las veces, la solución es manejar esto en el padre, ya que el flujo de responsabilidad solo es descendente. Sin embargo, a veces, es necesario eliminar un componente de uno de sus métodos. Sé que no puedo modificar sus accesorios, y si comienzo a agregar booleanos como estado, comenzará a ser realmente complicado para un componente simple. Esto es lo que estoy tratando de lograr: Un pequeño componente de cuadro de error, con una "x" para descartarlo. Recibir un error a través de sus accesorios lo mostrará, pero me gustaría una forma de cerrarlo desde su propio 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;
Y lo usaría así en el componente principal:
<ErrorBox error={this.state.error}/>
En la sección ¿Qué debo poner aquí? , Ya probé:
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
Lo que arroja un buen error en la consola:
Advertencia: unmountComponentAtNode (): React renderizó el nodo que estás intentando desmontar y no es un contenedor de nivel superior. En su lugar, haga que el componente principal actualice su estado y vuelva a procesarlo para eliminar este componente.
¿Debo copiar los accesorios entrantes en el estado ErrorBox y manipularlos solo internamente?
Respuestas:
Al igual que esa agradable advertencia que recibió, está tratando de hacer algo que sea un Anti-Patrón en React. Esto es un no-no. React tiene la intención de que suceda un desmontaje de una relación de padre a hijo. Ahora, si desea que un niño se desmonte solo, puede simular esto con un cambio de estado en el padre que es activado por el niño. déjame mostrarte en código.
este es un ejemplo muy simple. pero puede ver una forma aproximada de transmitirle al padre una acción
Dicho esto, probablemente debería pasar por la tienda (acción de envío) para permitir que su tienda contenga los datos correctos cuando se procese
He hecho mensajes de error / estado para dos aplicaciones separadas, ambas pasaron por la tienda. Es el método preferido ... Si lo desea, puedo publicar algún código sobre cómo hacerlo.
EDITAR: Así es como configuro un sistema de notificación usando React / Redux / Typescript
Pocas cosas para tener en cuenta primero. esto está en mecanografiado, por lo que necesitaría eliminar las declaraciones de tipo :)
Estoy usando los paquetes npm lodash para operaciones y nombres de clases (alias cx) para la asignación de nombres de clases en línea.
La belleza de esta configuración es que uso un identificador único para cada notificación cuando la acción la crea. (por ejemplo, notify_id). Esta identificación única es una
Symbol()
. De esta manera, si desea eliminar cualquier notificación en cualquier momento, puede hacerlo porque sabe cuál eliminar. Este sistema de notificación le permitirá apilar tantas como desee y desaparecerán cuando se complete la animación. Me estoy conectando al evento de animación y cuando finaliza, activo un código para eliminar la notificación. También configuré un tiempo de espera de respaldo para eliminar la notificación en caso de que la devolución de llamada de la animación no se active.notificaciones-acciones.ts
notificación-reducer.ts
app.tsx
en el render base para su aplicación, renderizaría las notificaciones
user-notification.tsx
clase de notificación de usuario
fuente
En lugar de usar
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
intenta usar
fuente
<div id="c1"><div id="c2"><div id="react-root" /></div></div>
. ¿Qué pasa sic1
se reemplaza el texto interno de ?En la mayoría de los casos, basta con ocultar el elemento, por ejemplo, de esta manera:
O puede renderizar / volver a renderizar / no renderizar a través de un componente principal como este
Finalmente, hay una forma de eliminar el nodo html, pero realmente no sé si es una buena idea. Tal vez alguien que conozca React from internal diga algo sobre esto.
fuente
He estado en esta publicación unas 10 veces y solo quería dejar mis dos centavos aquí. Puede desmontarlo condicionalmente.
Todo lo que tienes que hacer es eliminarlo del DOM para poder desmontarlo.
Siempre que
renderMyComponent = true
el componente se renderice. Si lo configurarenderMyComponent = false
, se desmontará del DOM.fuente
Esto no es apropiado en todas las situaciones, pero puede condicionalmente
return false
dentro del propio componente si se cumplen o no ciertos criterios.No desmonta el componente, pero elimina todo el contenido renderizado. Esto solo sería malo, en mi opinión, si tiene detectores de eventos en el componente que deberían eliminarse cuando el componente ya no sea necesario.
fuente