У меня есть главный редуктор (byVideoIds), который генерирует имя динамического ключа на основе action.videoId.Этот объект свяжется со списком комментариев.Я нормализовал подредуктор для комментариев byIds (объект по идентификатору комментария), allIds (массив идентификаторов комментариев, связанных с видео), а также показываю разбивку на страницы и isFetching.
Проблема, с которой я сталкиваюсь и не могу отследитьвниз, находится в комментарии удалить действие DELETE_COMMENT_SUCCESS, мое дерево состояний не обновляется, и массив allIds не изменяется.В результате мой пользовательский интерфейс не перерисовывается с изменениями.
Правильно ли я здесь использую комбинированные редукторы, вызывая объединяющий комбинат внутри редуктора byVideos.Я не знаю, нужно ли передавать состояние, действие и здесь в той же строке.
С кодом ниже мое дерево состояний загружается правильно и отображаются комментарии для каждого видео, однако при удалениидействие, пользовательский интерфейс не обновляется.
Если комбинированные редукторы не могут быть использованы таким образом.Какие есть варианты установки начального состояния для [videoId]?
const byVideoIds = (state = {}, action) => {
const { videoId } = action;
switch (action.type) {
case GET_COMMENTS_REQUEST:
return {
...state,
[videoId]: combineReducersComments(state[videoId], action)
};
case GET_COMMENTS_SUCCESS:
return {
...state,
[videoId]: combineReducersComments(state[videoId], action)
};
default:
return state;
}
};
//--------------------------------------------------------
const byIds = (state = {}, action) => {
const { comments } = action;
switch (action.type) {
case GET_COMMENTS_SUCCESS:
return {
...state,
...comments.reduce((obj, comment) => {
obj[comment.id] = comment;
return obj;
}, {})
};
default:
return state;
}
};
const allIds = (state = [], action) => {
switch (action.type) {
case GET_COMMENTS_SUCCESS:
return action.comments.map(comment => comment.id);
case DELETE_COMMENT_SUCCESS:
return state.filter(id => id !== action.commentId);
default:
return state;
}
};
const page = (state = 1, action) => {
switch (action.type) {
case GET_COMMENTS_SUCCESS:
return state + 1;
default:
return state;
}
};
const totalPages = (state = null, action) => {
switch (action.type) {
case GET_COMMENTS_SUCCESS:
return action.totalPages;
default:
return state;
}
};
const isFetching = (state = false, action) => {
switch (action.type) {
case GET_COMMENTS_REQUEST:
return true;
case GET_COMMENTS_SUCCESS:
case GET_COMMENTS_FAILURE:
return false;
default:
return state;
}
};
const combineReducersComments = combineReducers({
byIds,
allIds,
page,
totalPages,
isFetching
});