Ich spiele zum ersten Mal mit React.js herum und kann keine Möglichkeit finden, etwas auf einer Seite über ein Klickereignis ein- oder auszublenden. Ich lade keine andere Bibliothek auf die Seite, daher suche ich nach einer nativen Möglichkeit, die React-Bibliothek zu verwenden. Das habe ich bisher. Ich möchte die Ergebnisse div anzeigen, wenn das Klickereignis ausgelöst wird.
var Search= React.createClass({
handleClick: function (event) {
console.log(this.prop);
},
render: function () {
return (
<div className="date-range">
<input type="submit" value="Search" onClick={this.handleClick} />
</div>
);
}
});
var Results = React.createClass({
render: function () {
return (
<div id="results" className="search-results">
Some Results
</div>
);
}
});
React.renderComponent(<Search /> , document.body);
javascript
reactjs
user1725382
quelle
quelle
Antworten:
Reagiere um 2020
onClick
Rufen Sie im Rückruf die Setter-Funktion des Status- Hooks auf, um den Status zu aktualisieren und erneut zu rendern:JSFiddle
Reagiere um 2014
Der Schlüssel besteht darin, den Status der Komponente im Klick-Handler mit zu aktualisieren
setState
. Wenn die Statusänderungen angewendet werden, wird dierender
Methode mit dem neuen Status erneut aufgerufen:JSFiddle
quelle
quelle
Hier ist eine alternative Syntax für den ternären Operator:
ist äquivalent zu:
Lean warum
Auch alternative Syntax mit
display: 'none';
Wenn Sie jedoch zu viel verwenden
display: 'none'
, führt dies zu einer DOM-Verschmutzung und verlangsamt letztendlich Ihre Anwendung.quelle
Hier ist mein Ansatz.
Um dies zu erreichen, verwende ich im obigen Code folgenden Code:
Das wird
SomeElement
nur gerendert , wennopened
es wahr ist. Es funktioniert aufgrund der Art und Weise, wie JavaScript logische Bedingungen auflöst:Gründe für die Verwendung dieses Ansatzes anstelle von CSS 'Anzeige: keine';
<TabView>
alle 5 Registerkarten neu gerendert werden , wenn sich die Requisiten des übergeordneten Elements (z. B. ) ändern - selbst wenn Sie nur eine Registerkarte sehendisplay: invisible ? 'block' : 'none'
wodurch das Layout möglicherweise beschädigt wirdsomeBoolean && <SomeNode />
ist sehr einfach zu verstehen und zu begründen, insbesondere wenn Ihre Logik in Bezug auf die Anzeige von etwas oder nicht komplex wirdquelle
this.setState({isOpened: !isOpened});
. Hängen Sie nicht vom Status selbst ab, wenn Sie den Status ändern. Hier ist ein gutes Beispiel: reactjs.org/docs/… So sollte es sein :this.setState( s => ({isOpened: !s.isOpened}) )
. Beachten Sie die Pfeilfunktion in setState.Mit der neuesten Version von React 0.11 können Sie auch einfach null zurückgeben, damit kein Inhalt gerendert wird.
Auf Null rendern
quelle
Ich habe eine kleine Komponente erstellt, die dies für Sie erledigt: React-Toggle-Display
Es setzt das Stilattribut
display: none !important
basierend auf den Requisitenhide
odershow
.Anwendungsbeispiel:
quelle
Es gibt bereits einige großartige Antworten, aber ich denke nicht, dass sie sehr gut erklärt wurden, und einige der angegebenen Methoden enthalten einige Fallstricke, die die Leute stören könnten. Ich werde also die drei Hauptwege (plus eine Option außerhalb des Themas) durchgehen, um dies zu tun und die Vor- und Nachteile zu erklären. Ich schreibe dies hauptsächlich, weil Option 1 sehr empfohlen wurde und es viele potenzielle Probleme mit dieser Option gibt, wenn sie nicht richtig verwendet wird.
Option 1: Bedingtes Rendern im übergeordneten Element.
Diese Methode gefällt mir nur, wenn Sie die Komponente nur einmal rendern und dort belassen. Das Problem ist, dass jedes Mal, wenn Sie die Sichtbarkeit umschalten, die Komponente von Grund auf neu erstellt wird. Hier ist das Beispiel. LogoutButton oder LoginButton werden im übergeordneten LoginControl bedingt gerendert. Wenn Sie dies ausführen, werden Sie feststellen, dass der Konstruktor bei jedem Klick auf die Schaltfläche aufgerufen wird. https://codepen.io/Kelnor/pen/LzPdpN?editors=1111
Jetzt ist React ziemlich schnell darin, Komponenten von Grund auf neu zu erstellen. Es muss jedoch immer noch Ihren Code aufrufen, wenn Sie ihn erstellen. Wenn Ihr Konstruktor-, componentDidMount-, Rendering- usw. Code also teuer ist, wird die Anzeige der Komponente erheblich verlangsamt. Dies bedeutet auch, dass Sie dies nicht für statusbehaftete Komponenten verwenden können, bei denen der Status beim Ausblenden beibehalten (und beim Anzeigen wiederhergestellt) werden soll. Der einzige Vorteil besteht darin, dass die ausgeblendete Komponente erst erstellt wird, wenn sie ausgewählt ist. Versteckte Komponenten verzögern also nicht das anfängliche Laden der Seite. Es kann auch Fälle geben, in denen Sie möchten, dass eine Stateful-Komponente beim Umschalten zurückgesetzt wird. In diesem Fall ist dies die beste Option.
Option 2: Bedingtes Rendern im Kind
Dadurch werden beide Komponenten einmal erstellt. Schließen Sie dann den Rest des Rendercodes kurz, wenn die Komponente ausgeblendet ist. Sie können auch andere Logik in anderen Methoden mit der sichtbaren Stütze kurzschließen. Beachten Sie das console.log auf der Codepen-Seite. https://codepen.io/Kelnor/pen/YrKaWZ?editors=0011
Wenn die Initialisierungslogik schnell ist und die untergeordneten Elemente zustandslos sind, werden Sie keinen Unterschied in der Leistung oder Funktionalität feststellen. Warum sollte React jedoch bei jedem Umschalten eine brandneue Komponente erstellen? Wenn die Initialisierung jedoch teuer ist, wird sie bei Option 1 jedes Mal ausgeführt, wenn Sie eine Komponente umschalten, die die Seite beim Wechseln verlangsamt. Option 2 führt alle Inits der Komponente beim Laden der ersten Seite aus. Die erste Ladung verlangsamen. Sollte nochmal notieren. Wenn Sie die Komponente nur einmal basierend auf einer Bedingung anzeigen und nicht umschalten oder möchten, dass sie beim Umschalten zurückgesetzt wird, ist Option 1 in Ordnung und wahrscheinlich die beste Option.
Wenn das langsame Laden von Seiten jedoch ein Problem darstellt, bedeutet dies, dass Sie in einer Lebenszyklusmethode teuren Code haben, und das ist im Allgemeinen keine gute Idee. Sie können und sollten wahrscheinlich das langsame Laden von Seiten lösen, indem Sie den teuren Code aus den Lebenszyklusmethoden entfernen. Verschieben Sie es in eine asynchrone Funktion, die von ComponentDidMount gestartet wurde, und lassen Sie den Rückruf es mit setState () in eine Statusvariable setzen. Wenn die Statusvariable null ist und die Komponente sichtbar ist, muss die Renderfunktion einen Platzhalter zurückgeben. Andernfalls rendern Sie die Daten. Auf diese Weise wird die Seite schnell geladen und die Registerkarten werden beim Laden gefüllt. Sie können die Logik auch in das übergeordnete Element verschieben und die Ergebnisse als Requisiten an die untergeordneten Elemente senden. Auf diese Weise können Sie priorisieren, welche Registerkarten zuerst geladen werden. Oder speichern Sie die Ergebnisse im Cache und führen Sie die Logik nur aus, wenn eine Komponente zum ersten Mal angezeigt wird.
Option 3: Klassenverstecken
Das Verstecken von Klassen ist wahrscheinlich am einfachsten zu implementieren. Wie bereits erwähnt, erstellen Sie einfach eine CSS-Klasse mit display: none und weisen die Klasse basierend auf prop zu. Der Nachteil ist, dass der gesamte Code jeder versteckten Komponente aufgerufen wird und alle versteckten Komponenten an das DOM angehängt werden. (Option 1 erstellt die ausgeblendeten Komponenten überhaupt nicht. Und Option 2 schließt unnötigen Code kurz, wenn die Komponente ausgeblendet ist, und entfernt die Komponente vollständig aus dem DOM.) Es scheint, dass dies beim Umschalten der Sichtbarkeit nach einigen von Kommentatoren durchgeführten Tests schneller ist andere Antworten, aber ich kann nicht mit ihnen sprechen.
Option 4: Eine Komponente, aber Requisiten ändern. Oder vielleicht überhaupt keine Komponente und HTML zwischenspeichern.
Dieser funktioniert nicht für jede Anwendung und ist kein Thema, da es nicht darum geht, Komponenten auszublenden, aber für einige Anwendungsfälle ist er möglicherweise eine bessere Lösung als das Ausblenden. Angenommen, Sie haben Registerkarten. Möglicherweise können Sie eine Reaktionskomponente schreiben und mit den Requisiten ändern, was auf der Registerkarte angezeigt wird. Sie können JSX auch in Statusvariablen speichern und mithilfe einer Requisite entscheiden, welche JSX in der Renderfunktion zurückgegeben werden soll. Wenn die JSX generiert werden muss, tun Sie dies und zwischenspeichern Sie sie im übergeordneten Element und senden Sie die richtige als Requisite. Oder generieren Sie im Kind und zwischenspeichern Sie es im Zustand des Kindes und verwenden Sie Requisiten, um das aktive auszuwählen.
quelle
Dies ist eine gute Möglichkeit, das virtuelle DOM zu nutzen :
Beispiel hier
React Hooks verwenden:
Beispiel hier
quelle
this.setState()
.Sie setzen einen booleschen Wert im Status (z. B. 'show)' und führen dann Folgendes aus:
quelle
Best Practice finden Sie unten in der Dokumentation:
Rendern Sie das Element nur, wenn der Status gültig ist.
quelle
quelle
quelle
Ich beginne mit dieser Aussage des React-Teams:
Grundsätzlich müssen Sie die Komponente anzeigen, wenn auf die Schaltfläche geklickt wird. Sie können dies auf zwei Arten tun: mit reinem React oder mit CSS. Mit reinem React-Weg können Sie in Ihrem Fall so etwas wie den folgenden Code ausführen, sodass im ersten Durchgang Ergebnisse erzielt werden werden nicht so angezeigt, wie sie
hideResults
sindtrue
, aber durch Klicken auf die Schaltfläche ändert sich der Status undhideResults
wirdfalse
und die Komponente wird erneut mit den neuen Wertebedingungen gerendert. Dies ist eine sehr häufige Verwendung der Änderung der Komponentenansicht in React ...Wenn Sie weitere Studien zum bedingten Rendern in React durchführen möchten, klicken Sie hier .
quelle
Einfaches Ein- / Ausblenden-Beispiel mit React Hooks: (srry about no fiddle)
quelle
Wenn Sie sehen möchten, wie Sie die Anzeige einer Komponente umschalten können, überprüfen Sie diese Geige.
http://jsfiddle.net/mnoster/kb3gN/16387/
quelle
Eine einfache Methode zum Ein- und Ausblenden von Elementen in React using Hooks
Fügen wir nun unserer Rendermethode eine Logik hinzu:
Und
Gut gemacht.
quelle
In einigen Fällen kann eine Komponente höherer Ordnung nützlich sein:
Komponente höherer Ordnung erstellen:
Erweitern Sie Ihre eigene Komponente:
Dann können Sie es so verwenden:
Dies reduziert ein wenig das Boilerplate und erzwingt das Festhalten an Namenskonventionen. Beachten Sie jedoch, dass MyComp weiterhin instanziiert wird - der Weg zum Weglassen wurde bereits erwähnt:
{ !hidden && <MyComp ... /> }
quelle
Verwenden Sie das Modul rc-if-else
quelle
Eine Möglichkeit könnte darin bestehen, die React-
ref
Klasse zu verwenden und die CSS-Klasse mithilfe der Browser-API zu bearbeiten. Der Vorteil besteht darin, ein erneutes Rendern in React zu vermeiden, wenn der einzige Zweck darin besteht, ein DOM-Element auf Knopfdruck auszublenden / anzuzeigen.PS Korrigieren Sie mich, wenn ich falsch liege. :) :)
quelle
Wenn Sie Bootstrap 4 verwenden, können Sie das Element auf diese Weise ausblenden
quelle
Dies kann auch so erreicht werden (sehr einfacher Weg)
quelle
Dieses Beispiel zeigt, wie Sie zwischen Komponenten wechseln können, indem Sie einen Schalter verwenden, der alle 1 Sekunde wechselt
quelle
Verwenden Sie diese schlanke und kurze Syntax:
quelle
Hier kommt die einfache, effektive und beste Lösung mit einer klassenlosen Reaktionskomponente zum Ein- und Ausblenden der Elemente. Verwendung von React-Hooks, die im neuesten Projekt zum Erstellen und Reagieren von Apps verfügbar sind , das React 16 verwendet
Viel Spaß beim Codieren :)
quelle
quelle
Sie können die CSS-Datei verwenden
und in der CSS-Datei
quelle
quelle
quelle
quelle
const
anstelle von,var
wenn Sie Konstanten deklarieren.