在这个redux-react示例中,根reducer来自哪里?dispatch如何知道该使用哪个reducer



试图通过redux-react教程,我想知道rootReducer来自

import { createStore } from "redux";
import rootReducer from "./reducers";
export default createStore(rootReducer);

combineReducers是否自动导出rootReducer

https://codesandbox.io/s/9on71rvnyo?file=/src/redux/store.js

中的第二个问题

/components/AddTodo.js

handleAddTodo = () => {
this.props.addTodo(this.state.input);
this.setState({ input: "" });
};

handleAddTodo调用addTodo动作

/redux/actions.js

export const addTodo = content => ({
type: ADD_TODO,
payload: {
id: ++nextTodoId,
content
}
});

它只返回一个对象

但是是什么将addTodo连接到/reducers/todos.js中的减速器本身?

export default function(state = initialState, action) {
switch (action.type) {
case ADD_TODO: {
.....

combineReducers是否自动导出rootReducer?

是的,它有

export default combineReducers({ todos, visibilityFilter });

够了吗

reducers/todos.js中addTodo与reducers本身的连接是什么?

调度函数,当您调用此函数时:

this.props.addTodo(this.state.input);

在引擎盖下,你实际上在运行这样的东西:

dispatch(addTodo(this.state.input))

这是combineReducers:的伪代码

function combineReducers({ reducer1, reducer2 }) {
return (state, action) => {
if (action.type === 'reducer1') return reducer1(state.reducer1, action);
if (action.type === 'reducer2') return reducer2(state.reducer2, action);
}
}

这并不完全正确,尤其是回归部分,但希望它能给你一个想法。

基本上,它所做的是创建一个大的减速器,就好像两个减速器组合成一个一样。正如您可能已经知道的,reducer是一个函数,它接受上一个状态和操作,并返回下一个状态。

第二个问题:connect起了作用。一旦您将addTodo道具连接到存储,已经连接到reducer的存储将使用(prevState, action)值调用reducer(再次调用ONE BIG函数(。action将是addTodo动作生成器方法的返回值。

reducer执行其余操作,即检查匹配的操作类型(在本例中为ADD_TODO(是否存在,并执行它所做的操作。

最新更新