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

Aktualizacja komponentu w VUE

Object Storage Arubacloud
0 głosów
182 wizyt
pytanie zadane 6 maja 2020 w JavaScript przez kubavueamator Nowicjusz (140 p.)
Dzień dobry,

posidam aplikację napisaną w Vue. Jest to prosta aplikacja która ma component listy, w tym komponenecie posiadam for'a który tworzy mi elementy listy.

Elementy listy powinny być zrobione w momencie kiedy pobiorę dane z jednego serwisu, pobiorę dane z drugiego serwisu, a następnie zmapuje te dwa elementy w jeden i na tej podstawie powinienem zrobić foreach na komponenecie.

Mój problem polega na tym, że w momencie kiedy zmapuje dwa obiekty w jeden nie wiem wyświetlić elementy listy. Próbowałem to zrobić za pomocą watch {} ale w momencie kiedy w watch mam moje zmapowane obiekty nie mogę wyświetlić elementów.
komentarz 6 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)

Pokaż kod, będzie łatwiej Ci pomóc. Czy w konsoli są jakieś błędy?

komentarz 6 maja 2020 przez kubavueamator Nowicjusz (140 p.)

@JSHolic

<Match v-for="mappedMatch in mappedMatches" :key="mappedMatch.id" :match="mappedMatch" />
  watch: {
    teams(newVal) {
      var test = this.matches.values.map((match) => {
        return {
          homeTeam: newVal.values.find(element => element.id == match.homeTeam),
          awayTeam: newVal.values.find(element => element.id == match.awayTeam)
        };
      })

      this.$emit('match', test);
    },
  },
  computed: {
    ...mapGetters(["matchesCount", "isLoading", "matches", "teams"])
  },
{
prosp: ['mappedMatches']
}

 

komentarz 6 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)

Jak rozumiem, metoda teams się wykonuje i emituje tablicę obiektów test? Czy coś słucha na emitowany event match?

komentarz 6 maja 2020 przez kubavueamator Nowicjusz (140 p.)
Ten emit jest próbą, ale odpowiadając na pytanie, nic nie słucha na 'match'.

Ogólnie w tym podejściu dostaję Error w konsoli o tym że próbuję iterować po elemenciu który nie jest immutable. Jest to dla mnie jasny komunikat i zgadzam się z tym, że tak nie powinno się robić. Pytanie jest takie: Jak w takim razie updatować taki komponent?
komentarz 6 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)

Tutaj masz dokumentacje dla customowych eventów w Vue: https://vuejs.org/v2/guide/components-custom-events.html

Czy tutaj nie ma literówki: prosp -> props?

{
prosp: ['mappedMatches']
}

Czego dokładnie (której wartości/zmiennej) dotyczy błąd o immutable?

komentarz 6 maja 2020 przez kubavueamator Nowicjusz (140 p.)

tak, jest literówka

Jeśli w watch zamiast robić listę o nazwie test, przypisałem mapowanie do propertisa mappedMatches to dostałem komunikat o tym że próbuję iterować po mappedMatches, które jest zmienialne(mutable)

watch: {
  teams(newVal) {
    mappedMatches = this.matches.values.map((match) => {
      return {
        homeTeam: newVal.values.find(element => element.id == match.homeTeam),
        awayTeam: newVal.values.find(element => element.id == match.awayTeam)
      };
    })
  },
},

 

komentarz 6 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)

A czy przypisanie zmapowanego this.matches.values, nie powinno być do this.mappedMatches? Teraz przypisujesz do zmiennej mappedMatches, a nie do property componentu. Jeśli to jest immutable, to znaczy że nie możesz mutować (modyfikować) zawartości, ale przypisanie (zmiana referencji) do tego obiektu/tablicy powinna być możliwa.

Nie znam Vue, ale Twój problem polega na odświeżeniu DOM po wykonaniu asynchronicznej operacji. Tutaj masz podpowiedź na StackOverflow jak to zrobić - powinno pomóc: https://stackoverflow.com/a/49746754/4983840

komentarz 6 maja 2020 przez kubavueamator Nowicjusz (140 p.)

Tak powinno być this.mappedMatches.

Chodzi własnie o to że property mappedMatches w tym wypadku NIE JEST immutable i Vue tego nie pozwala zrobić, żeby w template iterować po mutowalnym polu bo ono może się zmieć i będzie się zmieniać na re-renderze. Przypisanie jest możliwe, ale nie możliwe jest tworzenie komponentów.

W podanym przez Ciebie linku do stackoverflow wszystko dzieje się w jednym komponencie. Korzystam ze Store i mechanizmu mapGetters. Problem w tym rozwiązaniu jest taki, że jeśli przyjdą dane z serwisu API i przypiszesz to do obiekut, który jest w 

data() {}

to komponent tego nie złapie. Myślałem, że watch jest od tego aby obserwować czy jakieś dane się zmieniły i na tej podstawie regować. Ale tak nie działa

komentarz 6 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)

property mappedMatches w tym wypadku NIE JEST immutable i Vue tego nie pozwala zrobić

To zrób je immutable i przypisz zmapowane dane do property?

Zapoznałeś się z computed property vs watch?

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 269 wizyt
pytanie zadane 3 sierpnia 2021 w JavaScript przez mikey Użytkownik (820 p.)
0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 27 stycznia 2019 w JavaScript przez Bakr Mądrala (6,850 p.)
0 głosów
1 odpowiedź 224 wizyt
pytanie zadane 20 czerwca 2018 w JavaScript przez mi-20 Stary wyjadacz (13,190 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...