@batonpeton

Как реализовать редактирование объекта на Redux?

Помогите пожалуйста, уже неделю ломаю голову!

Есть форма с двумя инпутами, данные с формы сохраняются в объекте, передаются в reducer.
Как должно все работать:
При нажатии на кнопку редактирования, данные из объекта отображаются в форме от туда их можно редактировать, по нажатию на кнопку сохранить - данные в объекте обновляются.
Как сейчас работает
Вместо редактирования объектасоздается новый объект;(
ниже хэндлер который сохраняет данные с формы и передает их в reducer
const submitHandler = (event:FormEvent<HTMLFormElement>) =>{
        event.preventDefault();
        dispatch({type:'product/ProductAdd',payload:{
            id:inputValue.id === '' ? nanoid() : inputValue.id,
            name:inputValue.name,
            price:inputValue.price,
        }}
        setInputValue(initialState);
        setCancel(false)
    }

Функция редактирования
const onClickEdit = (id: string) =>{
        
        product.forEach((elem: { id: string; name: string; price: string; }) => {
            if(id === elem.id){
                dispatch({type:'product/ProductEdit',payload:{
                    id:elem.id,
                    name:elem.name,
                    price:elem.price 
                }})
            }
            if(id === elem.id){
                setInputValue({   
                    id:elem.id,
                    name:elem.name,
                    price:elem.price    
                })
            }
            return elem    
        });
        setCancel(true);
    }

Вот reducer:
case 'product/ProductEdit':

            return {
                ...state,
                product:  state.product.map(elem => elem.id === action.payload.id ?
                    Object.assign({}, elem, action.payload) : elem )
            };
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега React
Код, вроде, выглядит рабочим. Так что подозреваю, что дело всё же в неправильном типе экшена:
dispatch({type:'product/ProductAdd'

case 'product/ProductEdit':


Если же это вы сюда скопировали как-то криво и тип экшена совпадает, то нужно смотреть что в inputValue.id в момент диспатча. Может, значение не заполняется, а может там идёт конвертация числа в строку, например, и строгое сравнение в редьюсере не проходит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы