Ponowne renderowanie komponentu po zmianach w localStorage - React.js

Ponowne renderowanie komponentu po zmianach w localStorage - React.js
K3
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:7
0

Czy jeśli np mam w React.js komponent <Header>, który służy do renderowania headera mogę w jakiś sposób ponownie go wyrenderować po zmianach w localStorage? Po pierwszym renderingu ponownie on się nie renderuje, ponieważ nic w nim się nie zmienia. Jednak po tym jak zostanie wpisane coś do localStorage chciałym ponownie go wyrenderować aby dodać pewny element do niego.

TS
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:394
1

localStorage emituje event, gdy coś się zmienia. Wystarczy, że to obsłużysz.

https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event

K3
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:7
0

@tsz: dzięki, ale co w tym evencie należałoby zrobić aby ponownie wybrany komponent wyrenderować?

I czy sessionStorage też coś takiego posiada?

Dodałem w componentDidMount event storage, ale w ogóle on się nie wykonuje przy wpisywaniu czegoś do localStorage. Dodam, że do localStorage wpisuje coś w innym komponencie.

edytowany 2x, ostatnio: kacon37
TS
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:394
0

A jak to zaimplementowałeś? Ja właśnie sobie z powodzeniem strzeliłem takim eventem pomiędzy dwoma zakładami z 4P. Dla sessionStorage oczywiście też powinno działać.

bearek
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad rok
  • Postów:85
0

@tsz: ale przecież ten event działa tylko w innych otwartych kartach:

The StorageEvent is fired whenever a change is made to the Storage object (note that this event is not fired for sessionStorage changes). This won't work on the same page that is making the changes — it is really a way for other pages on the domain using the storage to sync any changes that are made. Pages on other domains can't access the same storage objects.

Coś bajdurzysz :)

K3
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:7
0

Taki kod dodałem w headerze:

Kopiuj
class Header extends Component {
  
  componentDidMount() {
    window.addEventListener("storage", this.storageEventHandler);
  }

  storageEventHandler(evt) {
    alert("storage updated");
  }

W innym komponencie do localStorage coś wpisuje po wysłaniu forma, ale alert się nie wyświetla.

edytowany 1x, ostatnio: kacon37
bearek
Przeczytaj mój post wyżej. To tak nie działa. Może po prostu daj metodę, która zapisuje do localStorage i jednocześnie odświeża state? Nie sądzę, żeby był jakiś wbudowany sposób.
K3
Tyle, że do localStorage zapisuje item w innym komponencie niż w tym, który chce ponownie wyrenderować.
bearek
A nie jest emitowane przy tym jakieś zdarzenie przez ten komponent?
K3
jakie zdarzenie i w którym komponencie? Nic nie emituje.
bearek
No ja się pytam jakie :P Nie mam pojęcia o jakim komponencie mówisz. To jest Twój komponent czy jakaś paczka?
K3
Mam pewien form, który po uzupełnieniu wstawia dane do localStorage. Po wstawieniu danych do localStorage chce ponownie wyrenderować własny komponent Header, ponieważ chce zmienić wtedy w nim jedną rzecz (gdy localStorage nie jest pusty). W headearze żadne eventy nie są emitowane.
bearek
No i skąd ten form jest, bo nadal nie odpowiedziałeś? Napisałeś ten komponent czy ściągnąłeś? Jeśli napisałeś, to wyemituj event. Jeśli ściągnąłeś, to upewnij się na 100% czy nie emituje jakiegoś zdarzenia.
K3
To mój własny form. Ale to w formie czy headerze emitować zdarzenie? Wydaje mi się, że w headerze skoro go chce ponownie wyrenderować?
bearek
Nie - emituj zdarzenie w form, a w komponentach nadrzędnych nasłuchuj. I tak jak dojdziesz do headera, to po prostu niech header też nasłuchuje i tam już sobie zmieniaj state lub wymuś re-rendering. Ale mam przeczucie, że coś śmiesznie robisz, że chcesz "wymuszać renderowanie". Pamiętaj, że React to nie jQuery, tutaj zgłaszanie chęci renderowania czegoś nie jest powszechne. Nie masz state z tymi danymi, które chcesz wyrenderować?
K3
właśnie nie mam żadnego statu w headerze. A jakie zdarzenie w formie powinienem emitować?
K3
Po prostu jak localStorage nie jest pusty chce coś dodać do headera, masz może jakieś rozwiązanie na to lepsze?
bearek
No moim zdaniem jak coś się w headerze zmienia, to to powinien być state lub props na pewno.
K3
@bearek: i powinienem przekazywac wartość z forma do headera, którą zmienie state? Tylko, że header nie jest parentem dla forma
K3
w tym linku nie ma tego omówionego co chce zrobić. Tam jest pokazane proste przekazywanie propsów między komponentami parent->child.
bearek
Przerób sobie najlepiej wszystkie punkty z tej dokumentacji. Jest tam też o tym, co chcesz zrobić.
K3
o to ci chodzio? https://pl.reactjs.org/docs/handling-events.html. Tutaj zwykłe eventy są generowane
K3
Czy może chodzi o wynoszenie stanu w górę?
bearek
Czytaj ze zrozumieniem i się ucz :)
K3
Wydaje mi się, że tam nie ma rozwiązania dla tego co chce zrobić jak mam dwa całkowicie różne komponenty.
bearek
To nie ma znaczenia. A co to jest w tym headerze to chcesz zmieniać?
K3
Chcę dodawać/usuwać ikonkę do profilu w zależności od tego czy localStorage ma coś w sobie lub nie.
bearek
Te ikonki raczej powinny być stanem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.