Jak opcjonalnie dołączyć element do JSX? Oto przykład użycia banera, który powinien znajdować się w elemencie, jeśli został przekazany. Chcę uniknąć duplikowania tagów HTML w instrukcji if.
render: function () {
var banner;
if (this.state.banner) {
banner = <div id="banner">{this.state.banner}</div>;
} else {
banner = ?????
}
return (
<div id="page">
{banner}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
javascript
reactjs
react-jsx
Jack Allan
źródło
źródło
else
oddziału, czy to działa? Nie znam jsx ...Odpowiedzi:
Po prostu zostaw baner jako niezdefiniowany i nie zostanie uwzględniony.
źródło
null
działa równie dobrze jakundefined
? Czy jest to także część specyfikacji, która działa w ten sposób, a zatem prawdopodobnie nie pęknie w przyszłości?A co z tym. Zdefiniujmy prosty
If
komponent pomocniczy .I użyj tego w ten sposób:
AKTUALIZACJA: Ponieważ moja odpowiedź staje się popularna, czuję się zobowiązany do ostrzeżenia cię przed największym niebezpieczeństwem związanym z tym rozwiązaniem. Jak wskazano w innej odpowiedzi, kod wewnątrz
<If />
komponentu jest wykonywany zawsze, niezależnie od tego, czy warunek jest prawdziwy, czy fałszywy. Dlatego poniższy przykład zawiedzie w przypadku, gdybanner
jestnull
(zwróć uwagę na dostęp do właściwości w drugim wierszu):Musisz zachować ostrożność podczas korzystania z niego. Sugeruję przeczytanie innych odpowiedzi dla alternatywnych (bezpieczniejszych) podejść.
AKTUALIZACJA 2: Patrząc wstecz, takie podejście jest nie tylko niebezpieczne, ale także wyjątkowo kłopotliwe. Jest to typowy przykład sytuacji, gdy programista (ja) próbuje przenieść wzorce i podejścia, które zna z jednego obszaru do drugiego, ale tak naprawdę to nie działa (w tym przypadku inne języki szablonów).
Jeśli potrzebujesz elementu warunkowego, zrób to w ten sposób:
Jeśli potrzebujesz również gałęzi else, po prostu użyj operatora trójskładnikowego:
Jest o wiele krótszy, bardziej elegancki i bezpieczny. Używam tego cały czas. Jedyną wadą jest to, że nie można tak
else if
łatwo rozgałęziać, ale zwykle nie jest to tak powszechne.W każdym razie jest to możliwe dzięki działaniu operatorów logicznych w JavaScript. Operatory logiczne dopuszczają nawet takie małe sztuczki:
źródło
ReactElement
<span>
lub<div>
.Osobiście uważam, że wyrażenia trójskładnikowe w ( JSX In Depth ) są najbardziej naturalnym sposobem, który jest zgodny ze standardami ReactJs.
Zobacz następujący przykład. Na pierwszy rzut oka jest trochę niechlujny, ale działa całkiem dobrze.
źródło
Możesz też tak napisać
Jeśli
state.banner
jestnull
lubundefined
, po prawej stronie od warunku zostanie pominięty.źródło
Składnik
If
stylu jest niebezpieczny, ponieważ blok kodu jest zawsze wykonywany niezależnie od warunku. Na przykład spowoduje to wyjątek zerowy, jeślibanner
jestnull
:Inną opcją jest użycie funkcji wbudowanej (szczególnie przydatnej w przypadku instrukcji else):
Kolejna opcja reagowania na problemy :
źródło
&& + w stylu kodu + małe komponenty
Ta prosta składnia testu + konwencja w stylu kodu + małe skoncentrowane komponenty są dla mnie najbardziej czytelną opcją. Po prostu trzeba zachować szczególną ostrożność wartości falsy podoba
false
,0
albo""
.notacja
Składnia notacji ES7 na etapie 0 jest również bardzo przyjemna i definitywnie użyję jej, gdy moje IDE poprawnie ją obsługuje:
Więcej informacji tutaj: ReactJs - Tworzenie komponentu „Jeśli”… dobry pomysł?
źródło
short-circuit syntax
Proste, utwórz funkcję.
Jest to wzór, który osobiście cały czas stosuję. Sprawia, że kod jest naprawdę czysty i łatwy do zrozumienia. Co więcej, pozwala on na refaktoryzację
Banner
do własnego komponentu, jeśli staje się zbyt duży (lub ponownie używany w innych miejscach).źródło
Eksperymentalna
do
składnia ES7 ułatwia to. Jeśli używasz Babel, włącz tęes7.doExpressions
funkcję, a następnie:Zobacz http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions
źródło
Jak już wspomniano w odpowiedziach, JSX oferuje dwie opcje
Operator trójskładnikowy
{ this.state.price ? <div>{this.state.price}</div> : null }
Logiczna koniunkcja
{ this.state.price && <div>{this.state.price}</div> }
Jednak te nie działają
price == 0
.JSX wyrenderuje fałszywą gałąź w pierwszym przypadku, aw przypadku logicznej koniunkcji nic nie będzie renderowane. Jeśli właściwość może wynosić 0, po prostu użyj instrukcji if poza twoim JSX.
źródło
typeof(this.state.price) === "number"
jako warunek (w dowolnym wariancie).Ten komponent działa, gdy masz więcej niż jeden element w gałęzi „if”:
Stosowanie:
Ps ktoś myśli, że te składniki nie są dobre do odczytu kodu. Ale moim zdaniem HTML z javascript jest gorszy
źródło
Większość przykładów zawiera jeden wiersz „html”, który jest renderowany warunkowo. Wydaje mi się to czytelne, gdy mam wiele wierszy, które muszą być renderowane warunkowo.
Pierwszy przykład jest dobry, ponieważ zamiast tego
null
możemy warunkowo renderować inne treści, takie jak{this.props.showContent ? content : otherContent}
Ale jeśli chcesz tylko pokazać / ukryć zawartość, jest to jeszcze lepsze, ponieważ booleany, zero i niezdefiniowane są ignorowane
źródło
Istnieje inne rozwiązanie, jeśli komponent React :
źródło
Używam bardziej wyraźnego skrótu: Wyrażenie funkcji natychmiast wywołane (IIFE):
źródło
Zrobiłem https://www.npmjs.com/package/jsx-control-statements zrobić to nieco łatwiej, w zasadzie to pozwala na definiowanie
<If>
warunkowe jako znaczniki, a następnie zestawia je w trójskładnikowych IFS tak, że kod wewnątrz<If>
tylko dostaje wykonywane, jeśli warunek jest spełniony.źródło
Istnieje również naprawdę czysta wersja jednoliniowa ... {this.props.product.title || "Bez tytułu" }
To znaczy:
źródło
Ostatnio zrobiłem https://github.com/ajwhite/render-if, aby bezpiecznie renderować elementy tylko wtedy, gdy predykat przejdzie .
lub
źródło
Możesz warunkowo dołączyć elementy za pomocą operatora trójskładnikowego w następujący sposób:
źródło
Możesz użyć funkcji i zwrócić komponent oraz zachować cienką funkcję renderowania
źródło
Oto moje podejście przy użyciu ES6.
Demo: http://jsfiddle.net/kb3gN/16688/
Używam kodu takiego jak:
Uczyni to
SomeElement
tylko wtedy, gdyopened
będzie to prawdą. Działa ze względu na sposób, w jaki JavaScript rozwiązuje warunki logiczne:Jak
React
to zignorujęfalse
, uważam, że jest to bardzo dobry sposób warunkowego renderowania niektórych elementów.źródło
Może pomaga komuś, kto zada pytanie: Wszystkie renderowania warunkowe w React To artykuł o wszystkich różnych opcjach renderowania warunkowego w React.
Kluczowe informacje na temat tego, kiedy użyć renderowania warunkowego:
** Jeśli inaczej
** operator trójskładnikowy
** operator logiczny i&
** Sprawa przełącznik
** śliwki
** wielopoziomowe / zagnieżdżone renderingi warunkowe
** HOC
** zewnętrzne elementy szablonów
źródło
Za pomocą ES6 możesz to zrobić za pomocą prostej liniówki
„show” to boolean i używasz tej klasy przez
źródło
Nie sądzę, żeby o tym wspomniano. To twoja odpowiedź, ale myślę, że jest jeszcze prostsza. Zawsze możesz zwrócić ciągi z wyrażeń i możesz zagnieździć jsx wewnątrz wyrażeń, więc pozwala to na łatwe do odczytania wyrażenie wbudowane.
źródło
Podoba mi się jawność natychmiastowych wywołań wyrażeń funkcyjnych (
IIFE
) iif-else
powyżejrender callbacks
orazternary operators
.Musisz tylko zapoznać się ze
IIFE
składnią,{expression}
jest to zwykła składnia React, wewnątrz niej po prostu weź pod uwagę, że piszesz funkcję, która się wywołuje.które muszą być owinięte w pareny
źródło
Istnieje również technika wykorzystująca rekwizyty renderujące do warunkowego renderowania komponentu. Zaletą jest to, że renderowanie nie będzie oceniać, dopóki warunek nie zostanie spełniony, co nie powoduje obaw o wartości zerowe i niezdefiniowane .
źródło
Gdy musisz renderować tylko coś, jeśli spełniony warunek jest spełniony, możesz użyć składni:
Kod w ten sposób wyglądałby następująco:
Istnieją oczywiście inne ważne sposoby, aby to zrobić, wszystko zależy od preferencji i okazji. Możesz dowiedzieć się więcej na temat sposobu renderowania warunkowego w React w tym artykule, jeśli jesteś zainteresowany!
źródło
Wystarczy dodać kolejną opcję - jeśli podoba Ci się / toleruje skrypt kawy, możesz użyć polecenia coffee-reag, aby napisać swój JSX, w którym to przypadku, jeśli instrukcje / else są użyteczne, ponieważ są wyrażeniami w skrypcie kawy, a nie instrukcjami:
źródło
Wystarczy rozszerzyć odpowiedź @Jack Allan o odniesienia do dokumentów.
null
W takim przypadku sugerowana jest reakcja na podstawową dokumentację (Szybki start) . Jednak wartości logiczne, zerowe i niezdefiniowane są również ignorowane , o czym wspomniano w przewodniku dla zaawansowanych.źródło