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

react redux reducer

Object Storage Arubacloud
0 głosów
121 wizyt
pytanie zadane 23 lipca 2020 w JavaScript przez rob Bywalec (2,440 p.)

Witam, mam problem ze zmianą stanu w reducer, mam taki kod który działa, ale chyba nie tak powinienem zmieniać stan, proszę o pomoc. Chodzi o case DISPALY_DETAIL. Chodzi o to, że może być tylko jeden element true, wiec zmieniam wszystkie na false i potem nadpisuje ten wybrany na true.

const initItem = {
    items: [
        {
            title: 'Get out of bed',
            id: 1,
            selected: true,
            detail: {
                time: '16:30',
                date: '24.08.2020'
            }
        },
        {
            title: 'Walk the dog',
            id: 2,
            selected: false,
            detail: {
                time: '12:30',
                date: '19.09.2020'
            }
        }
    ],

}



const itemReducer = (state = initItem, action) => {

    switch (action.type) {
        case 'DELETE':
            console.log(action);
            let newItems = state.items.filter(item => {
                return item.id != action.id
            })
            return {
                ...state,
                items: newItems
            }
        case 'DISPLAY_DETAIL':
            console.log(action.id);
            const newDetail = state.items.map(item => {
                item.selected = false;
                if (item.id === action.id) {
                    item.selected = true;
                }
            })


    }
    return state
}

export default itemReducer

proszę o pomoc

komentarz 23 lipca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
Możesz szerzej opisać co chcesz zrobić w tym case?
komentarz 23 lipca 2020 przez rob Bywalec (2,440 p.)

Tylko jeden z obiektów w tablicy items może mieć selected :true. w zwiazku z tym zmieniam w tym case wszystkie elementy na false a potem nadpisuję  ten jeden który własnie ma selected:true 

item.selected = false;
                if (item.id === action.id) {
                    item.selected = true;
                }

ale chyba w ten sposób nie powinno się zmieniać stanu....

1 odpowiedź

0 głosów
odpowiedź 23 lipca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
wybrane 24 lipca 2020 przez rob
 
Najlepsza
Jeśli chcesz mieć jeden element który ma jakiś atrybut selected a cała reszta ma mieć ten atrybut w tym samym czasie ustawiony na false, to dla mnie to jest bez sensu... Nie prościej zrobić nową zmienna w reduxie, nazwać ją selectedItem i wrzucać do niej Id wybranego przedmiotu?
komentarz 23 lipca 2020 przez rob Bywalec (2,440 p.)
możesz podać przykłąd kodu? nie bardzo rozumiem
komentarz 23 lipca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
const initItem = {
    items: [...],
    selectedItem: null
}
 
 
 
const itemReducer = (state = initItem, action) => {
 
    switch (action.type) {
            ...
            'SET_SELECTED_ITEM'...
    }
    return state
}
 
export default itemReducer

 

komentarz 24 lipca 2020 przez rob Bywalec (2,440 p.)
dzieki bardzo, teraz wydaje mi się to oczywiste.....

Podobne pytania

0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 28 lipca 2020 w JavaScript przez rob Bywalec (2,440 p.)
+1 głos
1 odpowiedź 129 wizyt
pytanie zadane 25 czerwca 2020 w JavaScript przez marcinszary Nowicjusz (150 p.)
0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 13 czerwca 2020 w JavaScript przez rob Bywalec (2,440 p.)

92,589 zapytań

141,439 odpowiedzi

319,697 komentarzy

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

...