ReplaceReducer导致意外的密钥错误

时间:2015-12-04 19:14:13

标签: javascript reactjs redux

我有一个动态加载模块的React应用程序,包括模块的reducer功能,然后调用Redux的replaceReducer来替换reducer。不幸的是我收到错误

  

意外的密钥" bookEntry"在initialState参数中找到传递给createStore。预计会找到一个已知的reducer密钥:" bookList"," root"。意外的密钥将被忽略。

其中bookEntry 旧版reducer上的一个键,它被替换了。从bookEntry模块开始并切换到bookList会导致此反向错误

  

意外的密钥" bookList"在initialState参数中找到传递给createStore。预计会找到一个已知的减速器键:" bookEntry"," root"。意外的密钥将被忽略。

代码如下 - 取消注释评论代码确实解决了这个问题,但我猜不应该这样做。

我是否在做Redux的其他问题,是否需要使用此代码?

function getNewReducer(reducerObj){
    if (!reducerObj) return Redux.combineReducers({ root: rootReducer });

    //store.replaceReducer(function(){
    //    return {
    //        root: rootReducer()
    //    }
    //});

    store.replaceReducer(Redux.combineReducers({
        [reducerObj.name]: reducerObj.reducer,
        root: rootReducer
    }));
}

1 个答案:

答案 0 :(得分:10)

通常我们建议您在更改路径或加载新模块时“清理”数据。这会使应用程序的可预测性降低一些。如果我们谈论数十万的记录,那么肯定。这是您计划加载的数据量吗?

如果每个页面上只有几千个项目,那么卸载它们没有任何好处,并且存在与添加到应用程序的复杂性相关的缺点。因此,请确保您正在解决一个真正的问题,而不是过早地进行优化。

现在,发出警告信息。检查在combineReducers()内定义。这意味着将丢弃意外的状态键。删除管理bookEntry的{​​{1}}缩减器后,新的根缩减器不再识别该部分状态,state.bookEntry会发出警告,表明它将被丢弃。 请注意,这是一个警告,而不是错误。您的代码运行正常。我们使用combineReducers()来突出显示警告,但它实际上没有抛出,因此您可以放心地忽略它。

我们真的不希望警告可配置,因为您实际上隐式删除部分应用程序状态。通常人们会误做,而不是故意这样做。所以我们想对此发出警告。如果您想绕过警告,最好的办法是手动编写根减速器(目前由console.error()生成)。它看起来像这样:

combineReducers()

但我们推荐的模式是keep the old reducers around