【问题标题】:my reducer is executed but state does not update in react我的减速器已执行,但状态未在反应中更新
【发布时间】:2017-07-24 00:25:34
【问题描述】:

我正在为我的项目使用 recat redux,并且在一个组件中我需要更新我的状态,但由于我正在处理异步调用,我需要在我的 componentDidUpdate 中执行操作调用,如下所示:

 componentDidUpdate() {
   this.props.updateHamburgerMenu(this.props.Channel.channelIdArr);
}

这是我的行动:

export function updateHamburgerMenu(channelIdArr) {

return dispatch => {
    dispatch(
        {
            type: "UPDATE_HAMBURGER_MENU",
            payload:   {
                "channelIdArr":channelIdArr
            }

        }
    );

};
}

在我的减速器中我有:

switch (action.type) {
case "UPDATE_HAMBURGER_MENU":

        var channelList=state.allChannelList.slice();

        channelList.unshift({
            "id": channelIdArr[0],
            "channelName": "sssssssss",
            "status": "Inactive"
        });
        alert("reducer called");
        state.allChannelList=channelList;

        break;}
        return state;

现在当我运行它时,我可以看到警报正在工作,但状态根本没有更新。

我还尝试了以下另一种方法:

 state={"channelsArr":state.channelsArr,"AllChannels":state.AllChannels,"channelIdArr":state.channelIdArr,"channelLabelForScrolls":[], "latestAction":action.type, "allChannelList":channelList};
        break;

这样,状态似乎不断更新,它进入无限循环。 这真的很混乱,有人可以帮忙吗?我错过了什么?

更新:

当我在另一个减速器中分离 allChannelList 时,它可以工作。因此,在 componentdidupdate 的特定情况下更新 allChannelList 似乎会进入无限循环,并且状态会不断更新自身。但是我不知道为什么会发生这种情况

【问题讨论】:

    标签: reactjs react-redux redux-thunk


    【解决方案1】:

    在您的 reducer 案例语句中,您应该返回一个新对象,该对象表示当前操作之后的状态 - 您似乎试图直接分配给传入的 state 对象上的 allChannelList 属性。

    return {
        ...state,
        allChannelList: channelList
    };
    

    【讨论】:

    • 感谢您的回答,实际上我没有将返回状态放在这里,但在我的实际代码中,我返回了我更新了代码 sn-p 的状态。我返回状态如下:返回状态。对吗?
    • 我现在也试过了: state={ ...state, allChannelList: channelList } 它会无限执行并不断更新状态
    • 你不想对传入的state对象做任何事情;你只需要像我上面的例子一样返回一个完整的新对象
    • 我完全按照你说的做了,但我看到的只是有争议的 alert("reducer called");我故意放在那里进行测试,从来没有,这意味着状态不断更新!!!!
    • 我猜是因为您正在从componentDidUpdate 发送您的操作,它会在每次更新后再次调用它。
    猜你喜欢
    • 1970-01-01
    • 2021-07-18
    • 2017-11-09
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2017-06-14
    • 2020-11-17
    相关资源
    最近更新 更多