Как использовать редукторы с комбайном - PullRequest
0 голосов
/ 24 октября 2018

Итак, я пытаюсь использовать некоторую часть состояния одного редуктора в другом, и я искал решение, и, похоже, пакет 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?

1 Ответ

0 голосов
/ 24 октября 2018

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);

Итак, для вашей задачи это означает,что вы должны переписать свои authorsReducer и booksReducer, чтобы в качестве первого аргумента он получил все состояние, а не только свою собственную 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;
    }
}

НО! Я думаю, что этоэто не то, чего вы на самом деле хотите.

Существует еще один пакет, который делает именно то, что вам нужно Объединение секций-редукторов

Он позволяет получить доступ к корневому состоянию излюбой другой редуктор:

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;
    }
}
...