redux中执行dispatch()方法对store不同节点属性的干扰?

有两个不同的reducerconst initialArticlesState = { list: [], isFetching: false, pageIndex: 1, pageNum: 10 } const initialStickyArticlesState = { list: [], isShowLogo: true, isFetching: false, } function articlesReducer(state = initialArticlesState, action) { switch (action.type) { case GET_ARTICLES_REQUEST: return { ...state, isFetching: true } case GET_ARTICLES_SUCCESS: return { ...state, list:
关注者
12
被浏览
1120

5 个回答

谢邀 ☺️。

在redux 中,有一个 combineReducers 函数,它会组合所有的子 reducer ,并返回最终的 reducer 。

你要组合articlesReducer 和 stickyArticlesReducer ,一定使用到了它 .

附上combineReducers 精简版的源代码

function combineReducers(reducers) {
    // 这儿返回的函数就是最终的reducer 
    return function (state, action) {
        const keys = Object.keys(reducers)

        const newState = {}
        keys.forEach(key => {
            newState[key] = reducers[key](state[key], action)
        })
        return newState
    }
}

可以看到, 对于每一个 dispatch, redux 内部都会走所有的子 reducer 的。

在题主的代码中,

default:
    return { ...state, isFetching: false }
}

这句就会导致,不管发出什么dispatch, articles 的 isFetching 都会被置为false 。

建议这里不要在 default: 中更改state,只返回state就好 。

reducer default 有2个用处

  1. 初始化state , 在redux 内部, 会执行 state = dispatch({}) 来初始化state 。
  2. 在combineReducers 后, 防止其它reducer 的dispatch 相互干扰 。

以上 。


不知是否解决了题注的疑惑 。

action是通用的,它不和reducer绑定。reducer应该只处理需要关心的action,你的代码中写了:

default:
   return { ...state, isFetching: false };

这导致了isFetching被其他的action影响而变成了false。