【问题标题】:fundamental redux concept- how to actions launch reducers基本的 redux 概念 - 如何操作启动 reducer
【发布时间】:2021-07-23 11:51:24
【问题描述】:

为了简单起见,考虑这两个减速器(用打字稿编写):

export type userActionTypes = 
    | Interface1
    | Interface2

const initialState1 =  {...//some state} //<--comment indicates some sort of values are present
const initialState2 =  {...//some state}

const reducer1 = (state = initialState1, action: userActionTypes){
    switch(action.type) {
        case action1.case1:
            return {...//some new state1}
        default: return state
    }
}

const reducer2 = (state = initialState2, action: userActionTypes){
    switch(action.type){
        case action2.case2:
            return {...//some new state1}
        default: return state
    }
}

const rootReducer = combineReducers({
    mReducer1: reducer1,
    mReducer2: reducer2
})

现在说一下我们在代码中调用以下代码的地方:

newAction = {type: action2.type2, //some other values}
dispatch(newAction);

**我的问题是:** react如何知道调用哪个reducer? 我的意思是,它不会将动作传递给 rootReducer 中的每个 reducer,是吗?我的意思是,如果是这种情况,那么所有默认情况都将毫无意义,case 语句中的所有情况都必须是唯一的。这是不可能的吧?
react如何知道调用哪个reducer?

【问题讨论】:

    标签: reactjs typescript redux react-redux reducers


    【解决方案1】:

    react 如何知道调用哪个 reducer?我的意思是,它没有通过 对 rootReducer 中的每个 reducer 执行操作,是吗?

    技巧问题,redux 实际上调用了所有的 reducer。

    考虑你的根减速器:

    const rootReducer = combineReducers({
      mReducer1: reducer1,
      mReducer2: reducer2
    })
    

    这将创建一个 reducer 函数树。当一个 action 被分发到 store 时,它​​会调用 root reducer 并传递当前的 state 和当前的 action。减速器依次递归调用它们嵌套的组合减速器,传递stateaction,直到它们到达一个叶子,在那里你点击一个减速器函数并计算它们的下一个状态。他们要么有一个案例来处理action,要么返回默认案例,这只是他们当前的状态。递归返回,返回每个下一个状态切片,在每个级别组合,直到返回根 reducer,它返回整个下一个状态对象。

    我的意思是如果是这样的话,那么所有的默认情况都是 毫无意义,案例陈述中的所有案例都必须是 独特。这不可能吧?

    请记住,每个 reducer 函数在其一小部分状态上运行,而不是 整个state 对象。默认情况下,reducer 返回其当前状态值,因为它没有工作要做。 一个reducer函数中的所有reducer case都应该是唯一的。如果两个动作触发了相同的状态更新,那么它们应该被分组

    case "case1":
    case "case13":
      // both cases apply the same update
    

    【讨论】:

    • 我帖子中的后一个问题仍然存在,state 可以是任何东西,action 可以是任何东西,它如何唯一标识reducer?我的意思是,如果将操作传递给everyreducer,并且说两个reducer 具有相同的case 条件,那么它会调用其中的任何一个?
    • 是的。动作分派给所有reducer,只有具有确切动作的reducer才会对其进行操作,而其他reducer将丢弃它。 @大黄蜂
    • @BumbleBee redux reducer 函数的美妙之处在于它们可以响应/处理 any 发送到 store 的操作。 stateaction 被传递给每个 reducer 函数,多个 reducer 可以处理相同的操作。他们可能会为 他们的 状态切片做不同的事情,但他们可以通过相同的动作来做。识别任何特定的 reducer 并没有真正的关系,因为它们都被调用了。
    • @BumbleBee 啊,我明白了……不,无法控制调用任何特定的 reducer 函数,它们只是被全部调用并共同计算下一个状态。这确实是一种相当简单的状态管理方式。
    • @BumbleBee 不完全是。当 redux 处理分派的动作时,reducer 函数体(全部)将始终被执行。如果两个 reducer 有一个 case 处理相同的 dispatch action 类型,那么两个 case 的逻辑都将被应用。我知道您可能是指案件的主体,在这种情况下(不是双关语),是的,您的理解是正确的。
    猜你喜欢
    • 2023-04-09
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2019-09-26
    相关资源
    最近更新 更多