【问题标题】:Action payload is being used twice (Redux)动作有效负载被使用了两次(Redux)
【发布时间】:2018-04-05 17:18:33
【问题描述】:

我正在创建一个服务器端渲染的 React 应用程序,它使用 Redux 并从 Wordpress 安装中获取内容(通过 WP API)。请考虑以下减速器:

const initState = {
    mainMenu: null,
    userMenu: null
}

export default ( state = initState, action ) => {

    switch( action.type ) {

        case 'FETCH_MAIN_MENU':
            state = {
                ...state, 
                mainMenu: action.payload.data
            }           

        case 'FETCH_USER_MENU':
            state = {
                ...state, 
                userMenu: action.payload.data
            }                   

        default: 
            return state; 

    }

}

这两个动作都在服务器端调度,在应用程序第一次渲染之前,这两个动作都是返回两个不同菜单的承诺。问题是有时FETCH_USER_MENU 的有效负载实际上与FETCH_MAIN_MENU 的有效负载相同。据推测,当FETCH_USER_MENU 发出的承诺解析太慢时会发生这种情况,因此action.payload.data 采用FETCH_MAIN_MENU 情况下分配给它的值。我很确定这是怎么回事,因为如果我将 action.payload.data 任意设置为 null,则根本不会呈现用户菜单(同样,只是有时):

const initState = {
    mainMenu: null,
    userMenu: null
}

export default ( state = initState, action ) => {

    switch( action.type ) {

        case 'FETCH_MAIN_MENU':
            state = {
                ...state, 
                mainMenu: action.payload.data
            }           

        action.payload.data = null; 

        case 'FETCH_USER_MENU':
            state = {
                ...state, 
                userMenu: action.payload.data // Sometimes results as null
            }                   

        default: 
            return state; 

    }

}

除了为每个菜单创建不同的 reducer 之外,您能否提出一个解决方案,而我想避免这种情况?

【问题讨论】:

    标签: javascript reactjs redux


    【解决方案1】:

    问题是由Switch case fallthrough 引起的,因为您没有从case 语句返回,也没有使用break。理想情况下,使用 redux 您需要返回更新的状态。你会写

    export default ( state = initState, action ) => {
    
        switch( action.type ) {
    
            case 'FETCH_MAIN_MENU':
                return {
                    ...state, 
                    mainMenu: action.payload.data
                }           
    
            case 'FETCH_USER_MENU':
                return  {
                    ...state, 
                    userMenu: action.payload.data
                }                   
    
            default: 
                return state; 
    
        }
    
    }
    

    【讨论】:

    • 太棒了!谢谢。
    • 很高兴能帮上忙
    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多