Вы можете «монтировать» редуктор к различным слоям состояния.Для этого вы можете добавить path
к действию, а в редукторе обновить соответствующий фрагмент состояния.
Это может быть похоже на:
function reducer(state, action) {
if (action.type === '...') {
return _.set(_.deepClone(state), `${action.path}.isLoading`, false)
} else return state;
}
Другими словами, action определяет, с какой частью редуктора состояний будет работать.
Обратите внимание, что приведенный выше пример крайне неэффективен и предназначен только для демонстрационных целей.Вместо клонирования состояния следует использовать некоторые помощники неизменяемости: Колодный / помощник неизменности , mweststrate / immer , прочее.
UPD
Представьте, что у вас есть действие и редуктор для состояния ввода:
const UPDATE_VALUE = 'UPDATE_VALUE';
const updateValue = (value) => ({ type: UPDATE_VALUE, value })
function reducer(state, action) {
if (action.type === UPDATE_VALUE) {
return { ...state, input: action.value }
} else return state;
}
И вы хотите использовать это действие / редуктор для множества различных входов.Действие может быть снабжено путем к свойству, который указывает, какая часть или состояние должно быть обновлено, и, в конечном счете, какие входные данные будут получать новые реквизиты:
const UPDATE_VALUE = 'UPDATE_VALUE';
const updateValue = (value, path) => ({ type: UPDATE_VALUE, value, path })
function reducer(state, action) {
if (action.type === UPDATE_VALUE) {
return { ...state, [action.path]: action.value }
} else return state;
}
Это можно использовать затем:
dispatch(updateValue(event.target.value, 'firstNameInput'))
dispatch(updateValue('Doe', 'lastNameInput'))
Код в начале ответа является общей версией последнего.