• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed react, zmiana stanu działa jeżeli użyję operatora przypisania

VPS Starter Arubacloud
0 głosów
218 wizyt
pytanie zadane 6 września 2020 w JavaScript przez rob Bywalec (2,440 p.)
zamknięte 10 września 2020 przez rob

Witam

Mam taki kod

  const [startDate, setStartDate] = useState(null);
    const [newTask, setNewTask] = useState(initTask)


    const handleChange = (e) => {
        if (e.target.id === 'newTask') {
            // newTask.title = e.target.value
            setNewTask({
                ...newTask, title: e.target.value
            })

dlaczego mi to nie działa? jeżeli odkomentuję 4 linijkę od końca a zakomentuję 3 ostatnie kod działa, ale nie powinno się zmieniać stanu poprzez operator przypisania

proszę o pomoc

komentarz zamknięcia: Znalazłem rozwiązanie
komentarz 6 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Funkcja App jest cyklicznie wołana w setInterval z komponentu countDown, dlatego w konsoli widać spam console.log-ów.

Nie wiem dlaczego aktualizacja state dla newTask nie uwzględnia property title, bo o dziwo property id (ustawiane na końcu funkcji handleChange) jest uwzględniane.

Sprawdziłem w debuggerze i nawet użycie setNewTask z funkcją aktualizującą stan nie pomaga, więc nie wiem o co chodzi. Może to kwestia specyficznego użycia setInterval z Reduxem, albo jakiś corner case lub niezrozumienie Reacta.


Sprawdzałeś, czy aktualizacja state-u newTask w pozostałych ifach działa - tzn. czy wypełniając pozostałe pola formularza, to jest brane pod uwagę w state?

komentarz 6 września 2020 przez rob Bywalec (2,440 p.)

i tu jest cała zagwózdka bo

wszystkie trzy point, flag i id działają stan się zmienia a

title, notes, alarm.setAlarm i alarm.iconOn nie działają 

i wszystkie są w tym samym handleChange !!!! skąd taka wybiórczość?! frown

komentarz 6 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Szczerze mówiąc nie wiem. Próbując modyfikować kod przez debugger, zauważyłem że dowolna inna zmiana w pliku App.js nie powoduje efektu, bo to zmiany na source mapie, a oryginalny kod pozostaje bez zmian.

Spróbuj aktualizować stan przez callback, na zasadzie:

setNewTask((previousState) => ({
  ...previousState, title: e.target.value
}));

Jeśli to nie pomoże, to nie wiem o co chodzi. Niemniej, odświeżanie całego komponentu w setInterval może nie być dobrym pomysłem. Raczej powinno się odświeżać określone wartości, np. licznik lub czas (jeśli to zegarek).

komentarz 6 września 2020 przez rob Bywalec (2,440 p.)
w każdym razie bardzo dzięki za poświęcony czas
komentarz 10 września 2020 przez rob Bywalec (2,440 p.)

wiem w czym problem!!! 

wystarczyło przenieść tę linijkę

setNewTask({
            ...newTask, id: new Date().getTime()
        })

w miejsce gdzie będzie uruchamiana tylko raz ponieważ, wcześniej była wywoływana bezwarunkowo za każdym wywołaniem handleChnage i to wszystko mieszało...

Podobne pytania

0 głosów
1 odpowiedź 381 wizyt
pytanie zadane 29 stycznia 2021 w JavaScript przez sKodowany Obywatel (1,150 p.)
0 głosów
0 odpowiedzi 92 wizyt
pytanie zadane 2 sierpnia 2020 w JavaScript przez rob Bywalec (2,440 p.)
+1 głos
1 odpowiedź 466 wizyt

93,005 zapytań

141,971 odpowiedzi

321,251 komentarzy

62,342 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...