Je sais que cette question a déjà été posée à plusieurs reprises, mais la plupart du temps, la solution est de gérer cela dans le parent, car le flux de responsabilité ne fait que décroître. Cependant, parfois, vous devez supprimer un composant de l'une de ses méthodes. Je sais que je ne peux pas modifier ses accessoires, et si je commence à ajouter des booléens comme état, ça va commencer à être vraiment compliqué pour un composant simple. Voici ce que j'essaie de réaliser: Un petit composant de boîte d'erreur, avec un "x" pour le rejeter. Recevoir une erreur via ses accessoires l'affichera mais j'aimerais un moyen de le fermer à partir de son propre code.
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;
Et je l'utiliserais comme ceci dans le composant parent:
<ErrorBox error={this.state.error}/>
Dans la section Que dois-je mettre ici? , J'ai déjà essayé:
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
Ce qui jette une belle erreur dans la console:
Avertissement: unmountComponentAtNode (): le nœud que vous essayez de démonter a été rendu par React et n'est pas un conteneur de niveau supérieur. Au lieu de cela, demandez au composant parent de mettre à jour son état et le rendu afin de supprimer ce composant.
Dois-je copier les accessoires entrants dans l'état ErrorBox et les manipuler uniquement en interne?
Réponses:
Tout comme ce bel avertissement que vous avez reçu, vous essayez de faire quelque chose qui est un Anti-Pattern dans React. C'est un non-non. React est destiné à faire se produire un démontage d'une relation parent-enfant. Maintenant, si vous voulez qu'un enfant se démonte, vous pouvez simuler cela avec un changement d'état dans le parent qui est déclenché par l'enfant. laissez-moi vous montrer dans le code.
ceci est un exemple très simple. mais vous pouvez voir un moyen approximatif de transmettre au parent une action
Cela étant dit, vous devriez probablement passer par le magasin (action d'expédition) pour permettre à votre magasin de contenir les données correctes lors du rendu.
J'ai fait des messages d'erreur / d'état pour deux applications distinctes, les deux sont passées par le magasin. C'est la méthode préférée ... Si vous le souhaitez, je peux poster du code expliquant comment procéder.
EDIT: Voici comment j'ai mis en place un système de notification en utilisant React / Redux / Typescript
Peu de choses à noter en premier. c'est en typographie, vous devrez donc supprimer les déclarations de type :)
J'utilise les packages npm lodash pour les opérations et les noms de classe (alias cx) pour l'attribution de nom de classe en ligne.
La beauté de cette configuration est que j'utilise un identifiant unique pour chaque notification lorsque l'action la crée. (par exemple, notify_id). Cet identifiant unique est un
Symbol()
. De cette façon, si vous souhaitez supprimer une notification à tout moment, vous pouvez le faire, car vous savez laquelle supprimer. Ce système de notification vous permettra d'en empiler autant que vous le souhaitez et ils disparaîtront lorsque l'animation sera terminée. Je me connecte à l'événement d'animation et quand il se termine, je déclenche du code pour supprimer la notification. J'ai également mis en place un délai d'expiration de secours pour supprimer la notification au cas où le rappel d'animation ne se déclenche pas.notification-actions.ts
notification-reducer.ts
app.tsx
dans le rendu de base de votre application, vous rendriez les notifications
user-notification.tsx
classe de notification utilisateur
la source
à la place d'utiliser
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
essayez d'utiliser
la source
<div id="c1"><div id="c2"><div id="react-root" /></div></div>
. Et si le texte interne de étaitc1
remplacé?Dans la plupart des cas, il suffit de masquer l'élément, par exemple de cette manière:
Ou vous pouvez rendre / rendre / ne pas rendre via le composant parent comme celui-ci
Enfin, il existe un moyen de supprimer le nœud html, mais je ne sais vraiment pas si c'est une bonne idée. Peut-être que quelqu'un qui connaît React de l'intérieur dira quelque chose à ce sujet.
la source
Je suis allé à ce post environ 10 fois maintenant et je voulais juste laisser mes deux cents ici. Vous pouvez simplement le démonter sous condition.
Tout ce que vous avez à faire est de le supprimer du DOM pour le démonter.
Tant que
renderMyComponent = true
, le composant sera rendu. Si vous définissezrenderMyComponent = false
, il se démontera du DOM.la source
Ce n'est pas approprié dans toutes les situations, mais vous pouvez conditionnellement
return false
à l'intérieur du composant lui-même si un certain critère est satisfait ou non.Il ne démonte pas le composant, mais supprime tout le contenu rendu. Ce ne serait mauvais, dans mon esprit, que si vous avez des écouteurs d'événements dans le composant qui devraient être supprimés lorsque le composant n'est plus nécessaire.
la source