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

Getter, Setter w momencie consol.log'a obiektu

Object Storage Arubacloud
0 głosów
98 wizyt
pytanie zadane 2 czerwca 2020 w JavaScript przez Greeenone Pasjonat (16,100 p.)

Hej,

Mam pewien problem z updat'em danych które wyświetla pętla v-for.

Pętla wyświetla obiekty znajdujące się w tabeli "requirements". Tutaj wszystko działa. Problem pojawia się w momencie gdy chcę zaaktualizować pierwszy obiekt w tablicy.

W momencie kiedy używam

this.requirements[0] = data;

tablica nie wyświetla zmian dokonanych na obiekcie. Jeśli zrobię to w następujący sposób:

this.requirements[0].name = data.name;
this.requirements[0].value = data.value;

Dane się aktualizują bez problemu.

Zauważyłem, że w Consol.log'u dwa obiekty wyświetlane są innaczej

this.requirements[0] wyświetla się formie

Object { id: Getter & Setter,  name: Getter & Setter, value: Getter & Setter, … }

Data za to wyświetla się w następujący sposób:

Object { id: 20, name: "Jakas nazwa", value: "200" }

Wydaje mi się, że to jest przyczyną tego, że obiekt się nie aktualizuje

komentarz 2 czerwca 2020 przez ScriptyChris Mędrzec (190,190 p.)

Pokaż jak tworzysz this.requirements.

komentarz 2 czerwca 2020 przez Greeenone Pasjonat (16,100 p.)

Parent:

  methods: {
    loadData(){
      axios.get(uri).then(response=>{
        this.requirements = response.data.requirements;
      })
    }
  },

Przekazuje go potem do child'a:

 <datatable :emitedRequirements="requirements" />

Odbieram go za pomocą props a następnie "zamrażam" aby usunąć problem z mutacją

data() {
    return {
      requirements: []
    }
  },

  props: {
    emitedRequirements: Array,
  },

  mounted() {
    this.requirements = JSON.parse(JSON.stringify(
      this.emitedRequirements
    ));

  }

 

1 odpowiedź

+1 głos
odpowiedź 2 czerwca 2020 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 2 czerwca 2020 przez Greeenone
 
Najlepsza

Odbieram go za pomocą props a następnie "zamrażam" aby usunąć problem z mutacją

Gdzie go zamrażasz? JSON.parse(JSON.stringify( .. )) nie mrozi obiektu, tylko zwraca jego pełną kopię. Do zamrażania ("płytkiego") służy Object.freeze.

Czy Twoja apka chodzi w strict mode? Jeśli tak, to przy próbie mutacji zamrożonego obiektu powinien być rzucany w konsoli błąd.


W dokumentacji jest napisane, że Vue trawersuje obiekty przekazane przez propsy i zmienia ich wartości na gettery/settery (o czym wspomniałeś). Nie potrafi natomiast wykryć zmiany w tablicy dokonywanych w bezpośredni sposób (przez przypisanie) - przypadek opisany w drugim punkcie - ale wrapuje sobie jej metody prototypowe (push/pop/slice itd.). Więc aktualizacja tablicy powinna się udać przy ich użyciu.


Swoją drogą, dlaczego dane z props do data przekazujesz w hook'u mounted?

komentarz 2 czerwca 2020 przez Greeenone Pasjonat (16,100 p.)
edycja 2 czerwca 2020 przez Greeenone
1. Chodziło mi o kopie. Pobieram requirements z bazy i rozprowadzam go po komponentach które już potem działają niezależnie (Aby nie robić 4 razy takich samych zapytań tylko jedno)

2. Tak, jest w strict mode. W momencie kiedy próbuję dokonać zmian na propsie, konsola wypluwa błędy

3.Jeśli dobrze zrozumiałem, to muszę usunąc rekord a następnie wstawić na jego miejsce nowy ?

4. Szczerze to nie wiem. Widziałem to w kursie i tak jakoś robię :P
komentarz 2 czerwca 2020 przez ScriptyChris Mędrzec (190,190 p.)
edycja 2 czerwca 2020 przez ScriptyChris

1. Z dokumentacji wynika, że wartości zwracane z metody data są dostępne per instancja komponentu - więc raczej nie ma sensu ich kopiować przy przekazywaniu przez propsy

3. Metodami z Array.prototype (podałem przykłady i podlinkowałem docsy w poprzednim komentarzu). W Twoim przypadku splice powinien zmienić wartość tablicy pod konkretnym indeksem.

4. To spróbuj przerzucić się na przekazywanie props -> data https://vuejs.org/v2/guide/components-props.html#One-Way-Data-Flow . Chyba, że czekasz aż załaduje się DOM tego komponentu (mounted hook wtedy się odpala).

komentarz 2 czerwca 2020 przez Greeenone Pasjonat (16,100 p.)
Serdecznie dziękuje za wyjaśnienia :)

Podobne pytania

0 głosów
1 odpowiedź 277 wizyt
pytanie zadane 11 lipca 2019 w JavaScript przez Greeenone Pasjonat (16,100 p.)
0 głosów
0 odpowiedzi 71 wizyt
pytanie zadane 23 kwietnia 2020 w JavaScript przez Greeenone Pasjonat (16,100 p.)
0 głosów
1 odpowiedź 158 wizyt
pytanie zadane 27 czerwca 2019 w Java przez Eliro Stary wyjadacz (12,160 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...