• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

为什么我的Redux reducer重构失败?

JavaScript 来源:scarywolfman 11次浏览

这里就是我试图做的一个例子:为什么我的Redux reducer重构失败?

const setView = state => payload => ({ ...state, view: payload }); 

const reducers = { 
    SET_VIEW: setView 
}; 

export default (state = initialState, action) => reducers[action.type](state)(action.payload); 

不幸的是,我得到以下错误:

Uncaught TypeError: reducers[action.type] is not a function

我究竟在做什么错? reducers是一个带有函数的对象文字。


===========解决方案如下:

这实际上是一个相当晦涩的问题。究其原因是因为,每the Redux documentation on createStore

When a store is created, Redux dispatches a dummy action to your reducer to populate the store with the initial state. You are not meant to handle the dummy action directly. Just remember that your reducer should return some kind of initial state if the state given to it as the first argument is undefined, and you’re all set.

而且通过文档提到的只是让这个假动作恰好be this line the source:

dispatch({ type: ActionTypes.INIT }) 

这里,ActionTypes.INIT基本上是跟着一个随机字符串,字符串@@redux/INIT数字和句点。

因此,当你与createStore创建存储,虚拟动作被分派到你的减速,和动作类型在reducers对象不存在,所以你得到的错误,undefined是不是一个函数。这就是为什么你总是有你的减速机默认情况下。例如,与switch语句,你总是返回状态的默认情况下:

switch(action.type) { 
    … 
    default: 
    return state; 
} 

默认情况下允许的动作捕捉如终极版本身派出诱敌动作。同样的原则也适用于你的代码:

export default (state = initialState, action) => reducers[action.type] ? reducers[action.type](state)(action.payload) : state; 

这种检查是否减速的reducers对象实际存在。如果是这样,它会调用减速器。如果不是,就像在默认情况下一样,只是返回状态。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)