Я использую избыточность для приложения api-centri c и испытываю затруднения с концепцией основного и подробного поиска.
Скажем, я могу получить основной список с действием избыточного толчка, как это:
// action:
export const fetchItems = params => async (dispatch, getState) => {
dispatch({type: FETCH_ITEMS_REQUEST});
let response = await api.fetchItems(params);
dispatch({type: FETCH_ITEMS_SUCCESS, payload: normalize(response, schema)});
}
Затем я хочу детализировать один элемент, который я получаю следующим образом:
export const fetchItem = id = async (dispatch, getState) => {
dispatch({type: FETCH_SINGLE_ITEM_REQUEST});
let response = await api.fetchItem(id);
dispatch({type: FETCH_SINGLE_ITEM_SUCCESS, payload: normalize(response, schema)});
}
Они оба попадают в мой редуктор одинаково -
const reducer = (state, {type, payload}) => {
switch(type) {
case FETCH_ITEMS_SUCCESS:
case FETCH_SINGLE_ITEM_SUCCESS:
return {
...state,
allIds: payload.result.data,
byId: payload.entities.item,
error: null,
fetching: false
};
case FETCH_ITEMS_REQUEST:
case FETCH_SINGLE_ITEM_REQUEST:
// how do I/should I separate fetching id=1 vs fetching all items??
return { ...state, fetching: true, error: null };
case FETCH_ITEMS_FAILURE:
case FETCH_SINGLE_ITEM_FAILURE:
// how do I/should I separate fetching id=1 vs fetching all items for error??
return { ...state, fetching: false, error: payload };
}
}
Не думаю, что мне следует делиться извлечением и ошибкой в качестве переменных для одного элемента и всех элементов.
Я пошел по пути ошибок хеширования и получения статуса по идентификатору для отдельного элемента, но это отчасти уродливо.
Должен ли отдельный элемент быть перемещен в собственный редуктор? В каком случае он не должен следовать шаблону allIds / byId? Я не думаю, что хочу сделать это, потому что я хочу ввести кэширование, чтобы я мог проверить, существует ли запись, прежде чем запрашивать API.
Как структурировать мои редукторные редукторы как для множества, так и для отдельной записи?