Pomoc w zrozumieniu działania metody componentDidUpdate - React

Pomoc w zrozumieniu działania metody componentDidUpdate - React
K9
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:23
0

Hej :)

Mam pytanie, jest ono na bazie testów jakie mam na kursie obecnie:

Do zmiennej List przesyłane są najpierw props.items o wartości ['a', 'b', 'c'], a następnie ['a', 'x', 'y', 'z']. Ile razy w konsoli wyświetli "2"?

Już wiem, że trzykrotnie, niemniej jednak nie do końca rozumiem dlaczego

FU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:58
0

ComponentDidUpdate jest odpalane po tym jak zmieniły się propsy wyrenderowanego już komponentu. Za pierwszym razem renderuje się lista z trzema elementami, więc tutaj ComponentDidUpdate nie będzie uruchomiony z powodu pierwszego renderu. W drugim cyklu dostajesz nową tablicę elementów, w których 3 elementy są różne. Dla wartości 'a' nie zostanie przerenderowany ListItem, ponieważ nic się nie zmieniło dla pierwszego indexu. Pozostałe 3 ListItem'y mają nowe propsy i React zdecydował, że należy przerenderować te komponenty.

K9
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:23
0

Dzięki za odp :)

Ogólnie to samą metodę componentDidUpdate rozumiem, większy mam problem z tym co się dzieje w funkcji strzałkowej generującej List i przyjmującej props.

I tutaj pytanie: w ostatnim return mamy <ListItem key={index} text={text} />. To jest kluczowe miejsce w tym kodzie, bo ono decyduje poniekąd, czy się przerenderuje, czy nie, prawda? I teraz, gdy wchodzą nowe propsy, renderuje lub nie index oraz text, index nam się nie zmienia przy pierwszych trzech, bo to tablica, zmienia się tylko dla czwartego elementu (dodaje 'z') oraz dla zmiany dwóch textów ('x' oraz 'y') i dla tych 3 operacji jest rerender i odpala się metoda componentDidUpdate.

Czy takie łopatologiczne rozumowanie ma tutaj sens, czy gdzieś jest błąd logiczny?

edytowany 1x, ostatnio: Kefir92
FU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:58
0

Dobrze rozumiesz :) Z key też trzeba uważać. Index w tym przypadku to bardzo zły pomysł. Klucz powinien być nadany elementowi tak, aby można go było jednoznacznie wskazać na przykład przez jakieś niezmienne ID. W przypadku gdy masz 100 elementów na liście a kluczem jest index to po usunięciu z listy pierwszego elementu spowodujesz niepotrzebnie rerender pozostałych 99. Gdyby miały stały klucz to takiej sytuacji by nie było.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:mniej niż minuta
  • Postów:8406
1

Swoją drogą to jest porażka Reacta jako biblioteki, że żeby z niego korzystać, trzeba wiedzieć, co się kiedy uruchamia i ile razy.
Aczkolwiek coraz lepiej jest. Na ten moment możesz w większości przypadków już zrezygnować w nowych projektach z klas, i robić komponenty funkcyjne i używać w nich hooks https://reactjs.org/docs/hooks-intro.html
Trochę łatwiejszy w obsłudze się robi React, chociaż i tak nie jest idealnie, bo i tak cały model pracy z React jest do pewnego stopnia skopany. No i hooki też trzeba nauczyć się obsługiwać (np. useEffect nie przekłada się dokładnie na componentDidMount, bo domyślnie odpala się po każdym renderze, chyba, że da się pustą tablicę jako dodatkowy argument: https://reactjs.org/docs/hooks-effect.html#explanation-why-effects-run-on-each-update )

Ja się zastanawiam, czy nie zacząć się uczyć Svelte, bo mnie przekonała ta prezentacja. Wydaje się to bardziej straight-forward, bez robienia wszystkiego naokoło:


edytowany 3x, ostatnio: LukeJL
Chramar
Dzięki za podrzucenie tego talka, ten Svelte brzmi bardzo zacnie.
LukeJL
no ciekawe rzeczy ludzie robią.
K9
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:23
0

Dzięki za odp. To teraz rozwinięcie :D
Mamy poniżej dokładnie to samo, ale w <ListItem key={text} text={text} mamy teraz tak, czyli dla key nie ma już index jest tylko text. Prawidłowa odpowiedź to 1. Nie wiem dlaczego zmiana w obiekcie key na text powoduje brak rerenderingu pierwszych 3 wartości.

screenshot-20190427142737.png

FU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:58
0

W pierwszym cyklu renderuje się a, b, c i tutaj nie uruchomi się componentDidUpdate bo to pierwszy render. W drugim są zupełnie nowe klucze: x, y, z i dla nich jest to pierwszy render więc componentDidUpdate dla nich nie zostanie uruchomiony. Wygląda na to, że z jakiegoś powodu React uznał, że musi przerenderować a. Niestety w tej chwili nie mam pojęcia dlaczego - według mnie nie powinien tego robić. Jako tymczasowe rozwiązanie możesz nadpisać shouldComponentUpdate aby temu zapobiec. Wtedy w ogóle nie powinno być żadnego rerenderu dla tego przypadku.

DE
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
0
Fuffu napisał(a):

Dla wartości 'a' nie zostanie przerenderowany ListItem, ponieważ nic się nie zmieniło dla pierwszego indexu. Pozostałe 3 ListItem'y mają nowe propsy i React zdecydował, że należy przerenderować te komponenty.

To nie tak, Dla wartości ['a', 'x','y'] będzie componentDidUpdate. A dla wartości 'z', będzie componentDidMount.

Wojciech Pawlak napisał(a):

Dzięki za odp. To teraz rozwinięcie :D
Mamy poniżej dokładnie to samo, ale w <ListItem key={text} text={text} mamy teraz tak, czyli dla key nie ma już index jest tylko text. Prawidłowa odpowiedź to 1. Nie wiem dlaczego zmiana w obiekcie key na text powoduje brak rerenderingu pierwszych 3 wartości.

Tak jak napisał Fuffu:

Fuffu napisał(a):

W drugim są zupełnie nowe klucze: x, y, z i dla nich jest to pierwszy render więc componentDidUpdate dla nich nie zostanie uruchomiony. Wygląda na to, że z jakiegoś powodu React uznał, że musi przerenderować a.

Podsumowując wygląda na to, że jak komponent dostanie nowe propsy to się wykona componentDidUpdate i nie ważne, że są to propsy takie same, jakie otrzymał przy ostatnim renderze.
Jeżeli zmienimy key, to się wykona componentDidMount tak jak byśmy renderowali zupełnie nowy komponent.

EDIT: Sprawdźcie sami: https://jscomplete.com/playground/s263267

edytowany 1x, ostatnio: debug
K9
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:23
0

Dziękuję za odp. i za link z playground.

Pytanie tylko co dokładnie daje zmiana key={index} na key={text}? Widzę, że update robi jedynie dla wartości a?

DE
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
0

React po key rozpoznaje komponenty wygenerowane w pętli. Dlatego jeżeli zmienisz key, a zauważ, że jak ustawisz, key={text} to zmieni się on dla 3 komponentów. Dlatego React potraktuje je, jak zupełnie nowe komponenty i wykona się componentDidMount . Tylko dla text="a", nastąpi update. Bo komponent z takim kluczem już wcześniej był utworzony.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)