首页 > 解决方案 > 如何将 reduce-reducers 与 combineReducers 一起使用

问题描述

所以,我试图在另一个减速器中使用一个减速器的一些状态,我寻找了一个解决方案,似乎这个包reduce-reducers确实做到了,但这是我的问题......

我有以下rootReducer.js文件,我在其中导入所有减速器并将它们与combineReducers这样的组合......

import { combineReducers } from "redux";
import globalReducer from "./globalReducer";
import booksReducer from "../features/books/booksReducer";
import categriesReducer from "../features/categories/categoriesReducer";
import authorsReducer from "../features/authors/authorsReducer";

const rootReducer = combineReducers({
    global: globalReducer,
    books: booksReducer,
    categories: categriesReducer,
    authors: authorsReducer
});

export default rootReducer;

现在我想authors在书籍减速器中使用减速器的一些状态,我怎样才能用reduce-reducers包来实现呢?

标签: javascriptreactjsreduxreducereducers

解决方案


reduce-reducers像减速器的“合并”一样工作:

const reducer = (state = 0, action) => {
    switch (action.type) {
        case 'ADD':
            return state + action.value;
        case 'MULTIPLE':
            return state * action.value;
        default:
            return state;
    }
};

同样可以写成reduce-reducers

const addReducer = (state = 0, action) => {
    switch (action.type) {
        case 'ADD':
            return state + action.value;
        default:
            return state;
    }
};
const multipleReducer = (state = 0, action) => {
    switch (action.type) {
        case 'MULTIPLE':
            return state * action.value;
        default:
            return state;
    }
};

const reducer = reduceReducers(addReducer, multipleReducer, 0);

因此,在您的任务中,这意味着您应该重写您的authorsReducerbooksReducer因此它将整个状态作为第一个参数,而不仅仅是它自己的authors部分:

const before = (state = [], action) => {
    switch (action.type) {
        case `NEW_BOOK`:
            return state.concat([action.book]);
        default:
            return state;
    }
}

const now = (state = {}, action) => {
    switch (action.type) {
        case `NEW_BOOK`:
            return {
                ...state,
                books: state.books.concat([action.book]),
            };
        default:
            return state;
    }
}

但!我认为这不是你真正想要的。

还有另一个包可以完全满足您的需求combine-section-reducers

它允许您从任何其他减速器访问根状态:

const before = (state = [], action) => {
    switch (action.type) {
        case `NEW_BOOK`:
            return state.concat([action.book]);
        default:
            return state;
    }
}

const now = (state = [], action, rootState) => {
    switch (action.type) {
        case `NEW_BOOK`:
            return state.concat([{
                ...action.book,
                author: rootState.authors[action.book.authorId],
            }]);
        default:
            return state;
    }
}

推荐阅读