Редукс редуктор prevState уже настроен на newState - PullRequest
0 голосов
/ 07 июня 2018

Я использую избыточность для перемещения поискового фильтра через приложение к компонентам.

У меня есть компонент, в котором я устанавливаю фильтры и функцию диспетчеризации вызовов, используя

this.props.dispatch(setFilter(newFilter));

Я использую ползунки / компоненты диапазонадля установки значений эти компоненты имеют метод handleAfterChange, который настроен для вызова упомянутой функции диспетчеризации.Это работает нормально.

У меня также есть фильтры, которые настраиваются нажатием кнопок, я создал обработчик onClick, и этот обработчик вызывает упомянутую функцию.Я проверил то, что посылаю параметру setFilter functions (newFilter), и это то, что я хочу настроить.

Мое заданное действие определено:

export const setFilter = (filter = {}) => {
    return {
        type: SET_FILTER,
        filter
    };
};

Мой редуктор:

const searchFilter = (prevState = INITIAL_STATE.filter, action) => {
    switch (action.type) {
        case SET_FILTER: {
            // prevState is already the state 
            // I want to set up in this reducer
            console.log(prevState);
            return  Object.assign({}, prevState, action.filter);

        }
        case RESET_FILTER: {
            return INITIAL_STATE.filter;
        }
        default: {
            return prevState;
        }
    }
};

Проблема в том, что prevState уже является объектом, который я хочу установить в редукторе.Я проверяю (в другом компоненте), был ли изменен фильтр, и поэтому я получаю одинаковые prevProps и nextProps, поэтому никакие действия не будут инициированы.

Так что каким-то образом отправленные изменения уже находятся в редукторе как prevProps.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

@ РИЯХАН был частично прав.

Каким-то образом я напрямую изменял хранилище редуктов, даже если я делал все модификации объекта с помощью Object.assign(...).В конце концов, мне пришлось создать копию изменяемого объекта - JSON.parse(JSON.stringify(filter)), а затем обновить этот новый объект и отправить его в хранилище с избыточностью

0 голосов
/ 07 июня 2018

В searchFilter редукторе вы возвращаете prevState без изменений.

return prevState    //which is reference to prevState = INITIAL_STATE.filter

правильным способом (не уверен в структуре состояний),

 default: {
        return {...prevState};
     }

ИЛИ

 return  Object.assign({}, prevState);
...