javascript - 如何将 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
包来实现呢?
解决方案
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;
}
}
但!我认为这不是你真正想要的。
还有另一个包可以完全满足您的需求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;
}
}
推荐阅读
- javascript - Rails 和 JS,如何在我看来最好地获取输入日期
- php - 如何将 Serializer 注释转换为 YML 或 XML 配置?
- ruby - Chef Kitchen 会聚正在生成 [No space left on device - write] 错误
- java - java(eclipse):int类型的文字超出范围(但我将其设置为long)
- r - 传单 minichars 组论点
- oracle - ORA-01804: 未能初始化时区信息
- nestjs - Nestjs 在 6.10.11 版本中遇到内存泄漏
- asp.net - 下拉条件 ListItem ASP VB
- javascript - 如何使用 Datatables 语法将分页左对齐或居中对齐?
- sql - 在 Access SQL 中查找具有长文本数据类型的重复条目