Ich weiß, dass diese Frage bereits einige Male gestellt wurde, aber die meiste Zeit besteht die Lösung darin, dies beim Elternteil zu behandeln, da der Verantwortungsfluss nur absteigend ist. Manchmal müssen Sie jedoch eine Komponente mit einer ihrer Methoden beenden. Ich weiß, dass ich seine Requisiten nicht ändern kann, und wenn ich anfange, Boolesche Werte als Status hinzuzufügen, wird es für eine einfache Komponente wirklich chaotisch. Folgendes versuche ich zu erreichen: Eine kleine Fehlerbox-Komponente mit einem "x", um sie zu schließen. Wenn Sie einen Fehler über die Requisiten erhalten, wird er angezeigt, aber ich möchte einen Weg finden, ihn aus seinem eigenen Code zu schließen.
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;
Und ich würde es so in der übergeordneten Komponente verwenden:
<ErrorBox error={this.state.error}/>
Im Abschnitt Was soll ich hier setzen? , Ich habe es schon versucht :
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
Was einen schönen Fehler in der Konsole auslöst:
Warnung: unmountComponentAtNode (): Der Knoten, den Sie aushängen möchten, wurde von React gerendert und ist kein Container der obersten Ebene. Lassen Sie stattdessen die übergeordnete Komponente ihren Status aktualisieren und erneut rendern, um diese Komponente zu entfernen.
Sollte ich die eingehenden Requisiten in den ErrorBox-Status kopieren und nur intern bearbeiten?
Antworten:
Genau wie diese nette Warnung, die Sie erhalten haben, versuchen Sie, etwas zu tun, das ein Anti-Pattern in React ist. Dies ist ein Nein-Nein. React soll dazu führen, dass eine Beziehung zwischen Eltern und Kind aufgehoben wird. Wenn Sie nun möchten, dass sich ein Kind selbst abmeldet, können Sie dies mit einer Statusänderung im Elternteil simulieren, die vom Kind ausgelöst wird. Lass mich dir im Code zeigen.
Dies ist ein sehr einfaches Beispiel. Sie können jedoch einen groben Weg erkennen, um eine Aktion an das übergeordnete Element weiterzuleiten
Davon abgesehen sollten Sie wahrscheinlich das Geschäft durchlaufen (Versandaktion), damit Ihr Geschäft beim Rendern die richtigen Daten enthält
Ich habe Fehler- / Statusmeldungen für zwei separate Anwendungen erstellt. Beide haben den Speicher durchlaufen. Es ist die bevorzugte Methode ... Wenn Sie möchten, kann ich einen Code dazu veröffentlichen.
BEARBEITEN: So richte ich ein Benachrichtigungssystem mit React / Redux / Typescript ein
Einige Dinge, die zuerst zu beachten sind. Dies ist in Typoskript, so dass Sie die Typdeklarationen entfernen müssten :)
Ich verwende die npm-Pakete lodash für Operationen und Klassennamen (cx-Alias) für die Zuweisung von Inline-Klassennamen.
Das Schöne an diesem Setup ist, dass ich für jede Benachrichtigung eine eindeutige Kennung verwende, wenn die Aktion sie erstellt. (zB notify_id). Diese eindeutige ID ist a
Symbol()
. Auf diese Weise können Sie Benachrichtigungen zu jedem Zeitpunkt entfernen, da Sie wissen, welche Sie entfernen müssen. Mit diesem Benachrichtigungssystem können Sie so viele stapeln, wie Sie möchten, und diese verschwinden, wenn die Animation abgeschlossen ist. Ich bin mit dem Animationsereignis verbunden und wenn es beendet ist, löse ich einen Code aus, um die Benachrichtigung zu entfernen. Ich habe auch ein Fallback-Timeout eingerichtet, um die Benachrichtigung zu entfernen, falls der Animationsrückruf nicht ausgelöst wird.Benachrichtigungsaktionen.ts
Benachrichtigungsreduzierer.ts
app.tsx
Im Basis-Rendering für Ihre Anwendung würden Sie die Benachrichtigungen rendern
user-notification.tsx
Benutzerbenachrichtigungsklasse
quelle
anstatt zu verwenden
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
versuchen Sie es mit
quelle
<div id="c1"><div id="c2"><div id="react-root" /></div></div>
. Was ist, wenn der innere Text vonc1
ersetzt wird?In den meisten Fällen reicht es aus, das Element nur auf folgende Weise auszublenden:
Oder Sie können über diese übergeordnete Komponente rendern / erneut rendern / nicht rendern
Schließlich gibt es eine Möglichkeit, HTML-Knoten zu entfernen, aber ich weiß wirklich nicht, ob es eine gute Idee ist. Vielleicht sagt jemand, der React von intern kennt, etwas dazu.
quelle
Ich war jetzt ungefähr 10 Mal in diesem Beitrag und wollte nur meine zwei Cent hier lassen. Sie können es nur bedingt aushängen.
Sie müssen es lediglich aus dem DOM entfernen, um die Bereitstellung aufzuheben.
Solange
renderMyComponent = true
die Komponente gerendert wird. Wenn Sie festlegenrenderMyComponent = false
, wird die Bereitstellung aus dem DOM aufgehoben.quelle
Dies ist nicht in allen Situationen angemessen, aber Sie können
return false
innerhalb der Komponente selbst bedingt arbeiten, wenn ein bestimmtes Kriterium erfüllt ist oder nicht.Die Komponente wird nicht ausgehängt, aber alle gerenderten Inhalte werden entfernt. Dies wäre meiner Meinung nach nur dann schlecht, wenn die Komponente Ereignis-Listener enthält, die entfernt werden sollten, wenn die Komponente nicht mehr benötigt wird.
quelle