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

react redux poprawnośc kodu

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

Nie jestem pewny czy ten kawałek kodu jest zgodny z dobrymi praktykami, proszę o radę, nie wiem czy powinno się modyfikować w ten sposób stan, ale nic innego nie przychodzi mi do głowy.

chodzi o case 'CHANGE_CHECK': nie potrafię inaczej zmodyfikować stanu, czy to jest poprawnie? kod działa, ale nie do końca podoba mi się sposób

Po kliknieciu zmeinia się stan

const initItem = {
    todos: [
        {
            title: 'Get out of bed',
            titleMarked: false,
            id: 1,
            detail: [
                { point: 'wake my wife upGG', pointMarked: false },
                { point: 'check the weatherGG', pointMarked: true },
                { point: 'check the weatherGGG', pointMarked: false }
            ]
        },
        {
            title: 'Walk the dog',
            titleMarked: false,
            id: 2,
            detail: [
                { point: 'wake my wife upWW', pointMarked: true },
                { point: 'check the weatherWW', pointMarked: false },
            ]
        }
    ],
    selectedItem: {
        id: 1
    }

}



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

    switch (action.type) {
        case 'DELETE':
            let newItems = state.todos.filter(item => {
                return item.id != action.id
            })
            return {
                ...state,
                todos: newItems,
                selectedItem: newItems[0]
            }
        case 'DISPLAY_DETAIL':
            return {
                ...state,
                selectedItem: { id: action.id }

            }
        case 'ADD_NEW_TASK':
            return {
                ...state,
                todos: [...state.todos, action.newTask],
                selectedItem: { id: action.newTask.id },
            }
        case 'CHANGE_CHECK':
            const todos = state.todos.map(each => {
                const points = each.detail.map(each => {
                    if (action.id === each.point) {
                        each.pointMarked === false ? (each.pointMarked = true) : (each.pointMarked = false)
                    }
                })

            })
            return {
                ...state,

            }


    }
    return state
}

export default itemReducer
import React, { useEffect } from 'react'
import { connect } from 'react-redux'
import Points from './Points'
import alarm from './../assets/alarm.mp3'
import Play from './Play'

function Task(props) {




    const clickDelete = (id) => {
        props.deleteItem(id)
    }
    const handlePoint = (id) => {

        props.pointCheck(id)
    }
    const itemDetail = props.items.todos.filter(each => {
        return each.id === props.items.selectedItem.id
    })

    const [details] = itemDetail
    if (itemDetail.length < 1) {
        return (
            <div className='title'>
                <div className='title-wrapper'>
                    <p>You have no todos left</p>
                </div>
            </div>
        )
    }
    const alldetails = details.detail.map(each => {
        const pointcheck = each.pointMarked === true ?
            (<input onClick={(id) => { handlePoint(each.point) }} className='point-check' id={each.point} type="checkbox" checked />) :
            (<input onClick={(id) => { handlePoint(each.point) }} className='point-check' id={each.point} type="checkbox" />)
        return (
            <div>
                {pointcheck}
                <label className='point-label' htmlFor={each.point}>{each.point}</label>
            </div>
        )
    })
    return (
        <>
            <div className='task-container'>
                <div className='title'>
                    <div className='title-wrapper'>
                        <input className='title-check' type="checkbox" id="todo" name="todo" value="todo" />
                        <label className='title-label' htmlFor="todo" data-content={details.title}>{details.title}</label>
                    </div>
                    <i onClick={() => { clickDelete(details.id) }} className="fas fa-trash-alt"></i>
                </div>
                {alldetails}
            </div>

        </>
    )
}
const mapStateToProps = (state) => {
    return {
        items: state.item
    }
}
const mapDispatchToProps = (dispatch) => {
    return {
        deleteItem: (id) => { dispatch({ type: 'DELETE', id: id }) },
        pointCheck: (id) => { dispatch({ type: 'CHANGE_CHECK', id: id }) }
    }
}
export default connect(mapStateToProps, mapDispatchToProps)(Task)

proszę o pomoc, radę

komentarz 28 lipca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
A mógłbyś opisać co ten kod ma robić?
komentarz 28 lipca 2020 przez rob Bywalec (2,440 p.)
edycja 28 lipca 2020 przez rob

Chodzi o to, że po kliknieciu i uruchomieniu funkcji handlePoint jest uruchomiany dispatch 'CHANGE_CHECK' który zmienia stan w odpowiednim podpunkcie i  zmienia się stan tego podpunktu, wszystko działa ale gdzieś się dogrzebałem, ze nie powinno się zmieniać stanu bezpośrenio a ja to robię tak

if (action.id === each.point) {
                        each.pointMarked === false ? (each.pointMarked = true) : (each.pointMarked = false)
                    }

czy coś źle doczytałem i to jest dobrze czy nie za bardzo?  można tak zmienić stan?

each.pointMarked = true

jak masz jeszcze inne uwagi chętnie wysłucham

1 odpowiedź

0 głosów
odpowiedź 28 lipca 2020 przez Nasos Bywalec (2,730 p.)
wybrane 29 lipca 2020 przez rob
 
Najlepsza

Tak jak napisałeś, nie reducery nie powinny modyfikować stanu, jedynie zwracać nowy stan na podstawie poprzedniego.

Możesz to poprawić w taki sposób(nie przetestowałem więc możliwe że coś trzeba poprawić, ale ogólnie ideę prezentuje):

const todos = state.todos.map((todo) => {
  return {...todo, points: todo.detail.map((detail) => {
      if (action.id !== detail.point) return detail;
      return {...detail, pointedMarked: !detail.pointMarked}
  })}
})
return {
  ...state,
  todos
};

 

1
komentarz 29 lipca 2020 przez rob Bywalec (2,440 p.)
dzięki bardzo, z dwoma drobnymi poprawkami kod śmiga, na przyszłość będę wiedział jak

Podobne pytania

+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ź 121 wizyt
pytanie zadane 23 lipca 2020 w JavaScript przez rob Bywalec (2,440 p.)
0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 13 czerwca 2020 w JavaScript przez rob Bywalec (2,440 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...