【发布时间】:2016-01-13 05:30:00
【问题描述】:
Redux documentations 说我应该制作动作和动作创建者,像这样:
function addTodo(filter) {
return {
type: SET_VISIBILITY_FILTER,
filter
}
}
然后写reducers,像这样:
function todoApp(state = initialState, action) {
switch (action.type) {
case SET_VISIBILITY_FILTER:
return Object.assign({}, state, {
visibilityFilter: action.filter
});
}
}
然后我使用 dispatch 调用该操作:
store.dispatch(addTodo("Ask question on stackoverflow"));
看起来actions和reducers之间是一一对应的;该操作的唯一目的是选择一个减速器并为该减速器提供输入数据。
我们为什么不跳过中间人,用 reducer 来识别 action,用产生 reducer 的函数来识别 action creator?然后dispatch 将采用单个参数,即State => State 类型的reducer/action:
// Action/reducer. (Parametrised state transformer, really.)
const addTodo = text => state => {
return Object.assign({}, state, {
visibilityFilter: action.filter
});
}
// Dispatch takes as a argument the action/reducer
store.dispatch(addTodo("Ask question on stackoverflow"));
您将失去序列化动作的能力,但除此之外,您似乎会摆脱样板动作创建者并更清楚地表达动作和减速器之间的联系。如果您使用 Typescript,您还可以对操作中的数据进行类型检查,即difficult to express otherwise。
那么,我缺少将操作作为数据的原因是什么?
【问题讨论】:
-
阅读其他答案后,在我的答案中添加了一些注释。不知道它是否对 TypeScript 有帮助(可能你需要提供一些代码示例来显示确切的问题)。
标签: javascript typescript redux