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

react redux reducer

VPS Starter Arubacloud
0 głosów
145 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ź 125 wizyt
pytanie zadane 28 lipca 2020 w JavaScript przez rob Bywalec (2,440 p.)
+1 głos
1 odpowiedź 142 wizyt
pytanie zadane 25 czerwca 2020 w JavaScript przez marcinszary Nowicjusz (150 p.)
0 głosów
1 odpowiedź 147 wizyt
pytanie zadane 13 czerwca 2020 w JavaScript przez rob Bywalec (2,440 p.)

92,947 zapytań

141,899 odpowiedzi

321,118 komentarzy

62,283 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!

...