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

Wywoływanie fragmentu kodu zamiast typowej zmiennej Vuex

Object Storage Arubacloud
0 głosów
200 wizyt
pytanie zadane 26 października 2019 w JavaScript przez kordix Gaduła (3,910 p.)

Mam teraz taką dość ciężką rozkminę. Teraz akurat walczę ze store w Vuex, chociaż tego typu temat może pojawić się wszędzie indziej.

Tworzę sobie własną wersje gry monopoly.  Tak wygląda tablica z graczami w store:

players:[
        {color:'red', field:0, name:'red', money:1000,current:true },
        {color:'blue', field:0,name:'blue', money:1000,current:false},
        {color:'gray',field:0,name:'agent', money:0,current:false}
        ],

Wlaściwość field przechowuje numer pola na ktorym przebywa gracz. Sęk w tym też że numer pola musi się zrestować po przejściu całej planszy, tutaj robię to przez modulo.

Tak wygląda moja metoda na przenoszenie gracza:

let field = this.$store.state.players.find((el)=>el.current==true).field;
            field += val;
            field = field % 26;

Oczywiście ona nie zadziała, bo zapisując daną ze store do zmiennej field manipulujemy potem tylko zmienną field, a nie tym co faktycznie siedzi w store. 

Zadziała dopiero taki kod:

this.$store.state.players.find((el)=>el.current==true).field += val;
            this.$store.state.players.find((el)=>el.current==true).field = this.$store.state.players.find((el)=>el.current==true).field % 26;

Wygląda to dosyć idiotycznie, ale działa. Natomiast nie ma lepszego sposobu na używanie powtarzających się fragmentów kodu?

 

 

2 odpowiedzi

+1 głos
odpowiedź 27 października 2019 przez Magicone Nałogowiec (45,100 p.)

Jeśli chodzi o shortcut do ostatniej linijki:

const currentPlayer = this.$store.state.players.find(el => el.current);
currentPlayer.field = (currentPlayer.field + val) % 26;

Takie coś zadziała ze względu na to, że obiekty w JS są przekazywane jako referencja. Natomiast samo filtrowanie obiektów w taki sposób, że szukasz obecnego na podstawie wartości pól jest jakieś takie... passe. :P Użyj do przechowywania gracza o obecnym ruchu jakiegoś identyfikatora, np. indeksu w tablicy graczy. Na podstawie tego będziesz mógł wygodniej zmieniać obecnego i wygeneruje to ogólnie dosyć mniej problemów. Vuex działa w taki sposób, że obserwuje sobie obiekt i na podstawie zmian renderuje widoki. 

1
komentarz 27 października 2019 przez BT101 Stary wyjadacz (12,540 p.)
Dużo elegantszym rozwiązaniem byłoby użycie gettera.
komentarz 30 października 2019 przez kordix Gaduła (3,910 p.)

Czyli żeby zapisać aktualnego gracza do osobnej zmiennej?

Coś takiego:

//w state
currentPlayerId:0

//w getterach
  getters:{
      currentPlayer: state => { //stara wersja
          return state.players.find((el)=>el.current==true)
      },
      currentPlayerV2: state => { //nowa
          return state.players[state.currentPlayerId]
      },
      currentField: (state, getters) => {
    return state.fields[getters.currentPlayer.field];
  }

 

+1 głos
odpowiedź 27 października 2019 przez adrian17 Ekspert (344,860 p.)

A to nie zadziała?

let player = this.$store.state.players.find((el)=>el.current==true);
player.field += val;
player.field = player.field % 26;

 

Podobne pytania

0 głosów
1 odpowiedź 111 wizyt
pytanie zadane 21 lutego 2022 w JavaScript przez Pico Obywatel (1,330 p.)
0 głosów
0 odpowiedzi 227 wizyt
pytanie zadane 22 września 2021 w JavaScript przez Piotr Kułakowski Początkujący (390 p.)
0 głosów
1 odpowiedź 455 wizyt
pytanie zadane 29 grudnia 2018 w JavaScript przez Mash92 Użytkownik (670 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

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

...