【发布时间】:2016-02-03 16:46:42
【问题描述】:
在我的应用程序中,我有很多模块将常量、动作创建者和归约器分组在同一个文件中,以减少文件碎片,它们看起来像这样:
/**
* Store
* Products
*/
import { Api } from './api';
// Constants
const REQUEST_PRODUCTS = 'REQUEST_PRODUCTS';
const RECEIVE_PRODUCTS = 'RECEIVE_PRODUCTS';
// Action creators
export function requestProducts() {
return { type: REQUEST_PRODUCTS };
}
export function receiveProducts(json) {
return {
type: RECEIVE_PRODUCTS,
entities: json.results,
receivedAt: Date.now()
};
}
function fetchProducts() { // Thunk
return function (dispatch, getState) {
dispatch(requestProducts());
return Api.get('/products/')
.then(json => dispatch(receiveProducts(json)))
}
}
// Reducer
export function reducer(state = {
isFetching: false,
didInvalidate: false,
entities: []
}, action = '') {
switch (action.type) {
case REQUEST_PRODUCTS:
return Object.assign({}, state, {
isFetching: true,
didInvalidate: false
});
case RECEIVE_PRODUCTS:
return Object.assign({}, state, {
isFetching: false,
didInvalidate: false,
entities: action.entities,
lastUpdated: action.receivedAt
});
default:
return state
}
}
在我的商店配置中,我然后像这样导入减速器:
import { combineReducers } from 'redux';
import { routeReducer } from 'redux-simple-router'
const rootReducer = combineReducers({
routing: routeReducer,
products: require('../modules/products').reducer,
blah: require('../modules/blah').reducer,
});
export default rootReducer;
我从组件中导入如下操作:
import { fetchProducts } from '../modules/products';
dispatch( fetchProducts() );
除了动作创建函数中的常量名称和实体名称外,所有“存储”文件都完全相同。正如诫命所说:不要重复自己,这是重构的理想候选者,因此我正在尝试创建一个可以用来消除重复并且仍然对每个“商店”进行一定程度的定制的工厂。但鉴于我有限的 Javascript 经验,特别是 ES6 模块语法,我很难想出一个像样的解决方案。
我可以尝试任何想法吗?
【问题讨论】:
-
你读过 Redux real-world 的例子吗?它解决了很多这样的问题,但需要一段时间来解析他在做什么。
-
@Mike 是的,但是他使用“api 中间件”,我真的很难理解示例的语法,更不用说它是如何工作的了。我为我的应用选择了一条更简单的路线,但以重复结束。
-
我是从 Harry (csswizardry) 的一次谈话中听到的:DRY
-
是的,我也会不时记住这一点 :-) 谢谢!
标签: javascript reactjs redux