1

我正在阅读许多 Redux 教程,让我感到困惑的是,当使用组合 reducer 创建 Redux 存储时,通常会引用一个名称rootReducer作为 root reducer,尽管它从未主动命名。这是否类似于被利用的默认行为?因为它似乎是这样工作的。

我怀疑,这与方式有关,减速器与组合并导出

export default combineReducers.

这是一个例子:

./reducers/combined.js

import { combineReducers } from 'redux';
import filmReducer from './filmReducer';

export default combineReducers({
  media: filmReducer
});

然后,在./store.js中:

import { createStore, applyMiddleware } from 'redux';
... 
import rootReducer from './reducers';    // why can 'rootReducer' be imported?

无论如何,经过长时间的搜索,我仍然找不到任何关于这种现象的参考。

4

2 回答 2

3

您的减速器作为默认值导出,并且可以为默认导入指定任何名称

您也可以将其称为减速器。这取决于你想怎么称呼它

import reducer from './reducers';

如果您没有将减速器导出为默认值,而是一个命名导出,您应该在导入时使用相同的名称

例如:

import { combineReducers } from 'redux';
import filmReducer from './filmReducer';

export const reducer = combineReducers({
  media: filmReducer
});

将被导入为

import { reducer } from './reducers/combined';  

PS您还必须注意,您可以从目录中的index.js导入组件,而无需在导入路径中指定索引文件。但是对于任何其他文件名,您需要提及要导入的文件名

请参考MDN docs on import

于 2020-05-22T12:45:56.783 回答
0

Reducer 是一个函数,它接受先前的状态,即动作,然后返回一个新的状态。

(previousState, action) => nextState

在 redux 中,只有一个 reducer 函数。它处理所有动作并返回新状态。这个 reducer 函数通常称为 rootReducer,但您可以随意调用它。创建 store 时,第一个参数是根 reducer。

createStore(reducer, [preloadedState], [enhancer])

(查看文档:https ://redux.js.org/api/createstore )

随着您的应用程序变得越来越复杂,您将希望将归约函数拆分为单独的函数,每个函数管理状态的独立部分。

combineReducers 辅助函数将其值是不同归约函数的对象转换为可以传递给 createStore 的单个归约函数。

这是来自官方文档来解释什么是 combineReducers:https ://redux.js.org/api/combinereduers

在您的代码中:

export default combineReducers({
    media: filmReducer
 });

combineReducers 返回一个如上所述的 reducer 函数。export default然后将导出该函数,以便您可以从中导入它./store.js

如果您想了解有关导入/导出如何工作的更多信息,请查看此https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export

于 2020-05-22T13:00:54.523 回答