В настоящее время я начинаю с Redux, и мне неясно, как правильно привязать редуктор к динамически устанавливаемым суб-частям состояния.
Например, предположим, что мое состояние выглядит так (после асинхронного получения некоторых данных из серверных API)
{
"categories": {
"collection": {
"42": {
"id": "42",
"title": "whatever",
"owner_id": "10"
"posts": {
"collection": {
"36": {
"id": "36",
"title": "hello",
"content": "hello world"
},
"37": { // more posts ... }
},
"ids": ["36", "37", ...]
},
"otherChildren": { // more sub-entities }
},
"43": { // more categories ... }
},
"ids": ["42", "43", ...]
},
"users": {
"collection": {
"10": {
"id": "10"
"email": "[email protected]"
},
"11": { // more users ... }
},
"ids": [10, 11]
}
}
Мой корневой редуктор будет выглядеть так:
export default combineReducers({
categories: categoriesReducer,
users: usersReducer
})
и категорииReducer :
function categoriesReducer(state = initialState, action) {
switch (action.type) {
case FETCH_ALL_CATEGORIES_SUCCESS:
return Object.assign({}, state, {
categories: {
collection: action.payload
}
})
default:
return state
}
}
Теперь то, что я хотел бы сделать, это легко делегировать обработку части подмножества post
состояния с помощью функции postsReducer, в основном добавляя случай, например:
case FETCH_CATEGORY_ALL_POSTS_SUCCESS:
let categoryId = action.categoryId
return Object.assign({}, state, {
categories: {
[categoryId]: combineReducers({
"posts": postsReducer,
"otherChildren": otherChildrenReducer
})
}
}
Конечно, это не работает. Чего я не понимаю, так это того, как заставить редукс автоматически обновлять подмножество состояния, используя combReducer для вложенных редукторов, при этом автоматически передавая правильное подмножество в качестве аргумента состояния функции редуктора и не переопределяя существующие данные (т.е. категория в мой пример).
Каким-то образом мне удалось выполнить эту работу, написав свою собственную функцию «делегата», но это кажется довольно неправильным, особенно глядя на https://github.com/reactjs/redux/blob/master/src/combineReducers.js., который выглядит именно так.
Как я обычно должен это делать? Можно ли вообще использовать combReducers таким образом с Redux, я неправильно понимаю смысл combReducer или я ожидаю от него много волшебства?
Спасибо !
ИЗМЕНИТЬ/ОБНОВИТЬ:
Мне действительно нужно, чтобы они были вложенными (правильно, может быть, пример category
/post
не правильный), и я хотел бы, чтобы редуктор (то есть здесь, postsReducer, но это может быть редуктор Collection
) можно было повторно использовать в несколько мест.
(Почему я хочу, чтобы он был вложенным? На самом деле в этом примере допустим, что один post
может принадлежать только одному category
, поскольку данные post
на самом деле зашифрованы закрытым ключом из category
. Вот почему мне так логично изображать эту цепочку, это отношение в государстве)
Нет ли способа с редуксом делегировать другому редьюсеру при передаче надлежащего подмножества состояния - то есть, например, передать состояние categories.collection.42.posts.collection.36
в postReducer ?