Po raz pierwszy bawię się React.js i nie mogę znaleźć sposobu, aby pokazać lub ukryć coś na stronie poprzez zdarzenie click. Nie ładuję żadnej innej biblioteki na stronę, więc szukam natywnego sposobu korzystania z biblioteki React. To właśnie mam. Chciałbym wyświetlić div wyników, gdy zadziała zdarzenie kliknięcia.
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
użytkownik1725382
źródło
źródło
Odpowiedzi:
Reaguj około 2020 roku
W
onClick
wywołaniu zwrotnym wywołaj funkcję ustawiania haka stanu, aby zaktualizować stan i ponownie renderować:JSFiddle
Reaguj około 2014 roku
Kluczem jest aktualizacja stanu komponentu w module obsługi kliknięć za pomocą
setState
. Kiedy zmiany stanu zostaną zastosowane,render
metoda zostanie ponownie wywołana z nowym stanem:JSFiddle
źródło
źródło
Oto alternatywna składnia dla operatora trójskładnikowego:
jest równa:
Oprzyj się dlaczego
Również alternatywna składnia z
display: 'none';
Jeśli jednak nadużyjesz
display: 'none'
, prowadzi to do zanieczyszczenia DOM i ostatecznie spowalnia aplikację.źródło
Oto moje podejście.
W powyższym kodzie, aby to osiągnąć, 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:Powody stosowania tego podejścia zamiast CSS „display: none”;
<TabView>
) zmienią się - nawet jeśli zobaczysz tylko jedną kartę, wszystkie 5 kart zostanie ponownie renderowanychdisplay: invisible ? 'block' : 'none'
co może zepsuć układsomeBoolean && <SomeNode />
jest bardzo łatwe do zrozumienia i uzasadnienia, szczególnie jeśli twoja logika związana z wyświetlaniem czegoś lub nie jest skomplikowanaźródło
this.setState({isOpened: !isOpened});
. Podczas modyfikowania stanu nie należy polegać na samym stanie. Oto przykład dobre: reactjs.org/docs/... Tak powinno być:this.setState( s => ({isOpened: !s.isOpened}) )
. Zwróć uwagę na funkcję strzałki wewnątrz setState.w najnowszej wersji reagują na 0.11, możesz też po prostu zwrócić null, aby nie renderować treści.
Renderowanie do zera
źródło
Stworzyłem mały komponent, który obsługuje to za Ciebie: reaguj-przełącz-wyświetl
Ustawia atrybut stylu na
display: none !important
na podstawiehide
lubshow
rekwizytów .Przykładowe użycie:
źródło
Jest już kilka świetnych odpowiedzi, ale nie sądzę, że zostały one wyjaśnione bardzo dobrze, a kilka z podanych metod zawiera pewne gotówki, które mogą wprawić ludzi w osłupienie. Omówię trzy główne sposoby (plus jedna opcja nie na temat), aby to zrobić i wyjaśnić zalety i wady. Piszę to głównie, ponieważ Opcja 1 była bardzo zalecana i istnieje wiele potencjalnych problemów z tą opcją, jeśli nie zostanie użyta poprawnie.
Opcja 1: Renderowanie warunkowe w obiekcie nadrzędnym.
Nie podoba mi się ta metoda, chyba że zamierzasz renderować komponent tylko raz i zostawić go tam. Problem polega na tym, że spowoduje to reakcję na tworzenie komponentu od zera za każdym razem, gdy zmienisz widoczność. Oto przykład. LogoutButton lub LoginButton są warunkowo renderowane w nadrzędnym LoginControl. Jeśli to uruchomisz, zauważysz, że konstruktor jest wywoływany przy każdym kliknięciu przycisku. https://codepen.io/Kelnor/pen/LzPdpN?editors=1111
Teraz React bardzo szybko tworzy komponenty od zera. Jednak nadal musi wywoływać kod podczas jego tworzenia. Więc jeśli twój konstruktor, składnik componentDidMount, renderowanie itp. Jest drogi, wówczas znacznie spowolni wyświetlanie komponentu. Oznacza to również, że nie można tego używać z komponentami stanowymi, w których chcesz zachować stan, gdy jest ukryty (i przywracany, gdy jest wyświetlany). Jedną zaletą jest to, że ukryty komponent nie jest tworzony, dopóki nie zostanie wybrany. Ukryte komponenty nie opóźnią początkowego ładowania strony. Mogą również wystąpić sytuacje, w których CHCESZ stanowy komponent zresetować po przełączeniu. W takim przypadku jest to najlepsza opcja.
Opcja 2: Renderowanie warunkowe u dziecka
To tworzy oba komponenty jeden raz. Następnie zewrzyj resztę kodu renderowania, jeśli komponent jest ukryty. Możesz także zwierać inną logikę innymi metodami, używając widocznego rekwizytu. Zwróć uwagę na plik console.log na stronie codepen. https://codepen.io/Kelnor/pen/YrKaWZ?editors=0011
Teraz, jeśli logika inicjalizacji jest szybka, a dzieci są bezstanowe, nie zobaczysz różnicy w wydajności lub funkcjonalności. Dlaczego jednak React tworzy i tak nowy element przy każdym przełączaniu? Jeśli inicjalizacja jest jednak droga, opcja 1 uruchomi ją za każdym razem, gdy przełączysz komponent, co spowolni stronę podczas przełączania. Opcja 2 uruchomi wszystkie inicjały składnika przy ładowaniu pierwszej strony. Spowolnienie pierwszego obciążenia. Należy zanotować ponownie. Jeśli wyświetlasz komponent tylko raz w oparciu o warunek i nie przełączasz go, lub chcesz, aby zresetował się po przełączeniu, to opcja 1 jest w porządku i prawdopodobnie najlepsza opcja.
Jeśli jednak powolne ładowanie strony stanowi problem, oznacza to, że masz kosztowny kod w metodzie cyklu życia i ogólnie nie jest to dobry pomysł. Możesz i prawdopodobnie powinieneś rozwiązać powolne ładowanie strony, usuwając kosztowny kod z metod cyklu życia. Przenieś go do funkcji asynchronicznej uruchomionej przez ComponentDidMount, a wywołanie zwrotne umieść ją w zmiennej stanu za pomocą setState (). Jeśli zmienna stanu ma wartość NULL, a komponent jest widoczny, funkcja renderowania zwraca symbol zastępczy. W przeciwnym razie wyrenderuj dane. W ten sposób strona ładuje się szybko i zapełnia karty podczas ładowania. Możesz także przenieść logikę do rodzica i przekazać wyniki dzieciom jako rekwizyty. W ten sposób możesz ustalić, które karty będą ładowane jako pierwsze. Lub buforuj wyniki i uruchamiaj logikę tylko przy pierwszym wyświetleniu komponentu.
Opcja 3: Ukrywanie klas
Ukrywanie klas jest prawdopodobnie najłatwiejsze do wdrożenia. Jak wspomniano, po prostu tworzysz klasę CSS z display: none i przypisujesz klasę na podstawie prop. Minusem jest to, że wywoływany jest cały kod każdego ukrytego komponentu, a wszystkie ukryte komponenty są dołączane do DOM. (Opcja 1 w ogóle nie tworzy ukrytych komponentów. Opcja 2 powoduje zwarcie niepotrzebnego kodu, gdy komponent jest ukryty i całkowicie usuwa komponent z DOM). Wygląda na to, że szybsze przełączanie widoczności jest szybsze według niektórych testów przeprowadzonych przez komentujących inne odpowiedzi, ale nie mogę z tym rozmawiać.
Opcja 4: jeden element, ale zmień rekwizyty. A może żaden komponent i buforuj HTML.
Ten nie będzie działał dla każdej aplikacji i jest nie na temat, ponieważ nie dotyczy ukrywania komponentów, ale może być lepszym rozwiązaniem w niektórych przypadkach użycia niż ukrywanie. Powiedzmy, że masz karty. Może być możliwe napisanie jednego React Component i po prostu użycie rekwizytów, aby zmienić to, co wyświetla się na karcie. Możesz także zapisać JSX do zmiennych stanu i użyć rekwizytu, aby zdecydować, który JSX ma zostać zwrócony w funkcji renderowania. Jeśli JSX musi zostać wygenerowany, zrób to i buforuj go w obiekcie nadrzędnym i wyślij poprawny jako rekwizyt. Lub wygeneruj w dziecku i buforuj go w stanie dziecka i użyj rekwizytów, aby wybrać aktywny.
źródło
To dobry sposób na wykorzystanie wirtualnego DOM :
Przykład tutaj
Korzystanie z haków React:
Przykład tutaj
źródło
this.setState()
.Ustawiasz wartość logiczną w stanie (np. „Pokaż)”, a następnie:
źródło
Najlepsza praktyka znajduje się poniżej, zgodnie z dokumentacją:
Renderuj element tylko wtedy, gdy stan jest poprawny.
źródło
źródło
źródło
Zaczynam od stwierdzenia zespołu React:
Zasadniczo musisz pokazać komponent po kliknięciu przycisku, możesz to zrobić na dwa sposoby, używając czystego React lub CSS, używając czystego React, możesz zrobić coś takiego jak poniższy kod w twoim przypadku, więc przy pierwszym uruchomieniu wyniki nie pokazując jak
hideResults
jesttrue
, ale klikając na przycisk, zmiany gonna państwowej ihideResults
jestfalse
i get składnik świadczonych ponownie z nowymi warunkami wartości, to jest bardzo powszechne stosowanie zmianę widoku komponentu w React ...Jeśli chcesz dalej studiować renderowanie warunkowe w React, zajrzyj tutaj .
źródło
Prosty przykład ukryj / pokaż za pomocą React Hooks: (srry about no fiddle)
źródło
Jeśli chcesz zobaczyć, jak PRZEŁĄCZYĆ wyświetlanie komponentu, sprawdź to skrzypce.
http://jsfiddle.net/mnoster/kb3gN/16387/
źródło
Prosta metoda wyświetlania / ukrywania elementów w React przy użyciu haków
Dodajmy teraz logikę do naszej metody renderowania:
I
Dobra robota.
źródło
W niektórych przypadkach przydatny może być komponent wyższego rzędu:
Utwórz komponent wyższego rzędu:
Rozszerz swój własny komponent:
Następnie możesz użyć tego w następujący sposób:
Zmniejsza to nieco klepsydrę i wymusza przestrzeganie konwencji nazewnictwa, jednak należy pamiętać, że MyComp będzie nadal tworzony - utworzono sposób pominięcia:
{ !hidden && <MyComp ... /> }
źródło
Użyj modułu rc-if-else
źródło
Jednym ze sposobów może być użycie React
ref
i manipulowanie klasą CSS za pomocą interfejsu API przeglądarki. Jego zaletą jest unikanie ponownego wysyłania w React, jeśli jedynym celem jest ukrycie / pokazanie elementu DOM po kliknięciu przycisku.PS Popraw mnie, jeśli się mylę. :)
źródło
Jeśli używasz bootstrap 4, możesz w ten sposób ukryć element
źródło
Można to również osiągnąć w ten sposób (bardzo łatwy sposób)
źródło
ten przykład pokazuje, jak można przełączać się między komponentami za pomocą przełącznika, który przełącza się co 1 sekundę
źródło
Użyj tej szczupłej i krótkiej składni:
źródło
Oto proste, skuteczne i najlepsze rozwiązanie z Bezklasowym Reaktorem do pokazywania / ukrywania elementów. Korzystanie z React-Hooks, które jest dostępne w najnowszym projekcie tworzenia aplikacji React, który wykorzystuje React 16
Happy Coding :)
źródło
źródło
Możesz użyć pliku css
oraz w pliku css
źródło
źródło
źródło
źródło
const
zamiastvar
deklarować stałe.