redux调度多次开火

redux调度多次开火,redux,react-redux,redux-thunk,Redux,React Redux,Redux Thunk,我在Redux中遇到了以下不必要的行为(React/Redux+Redux-thunk):我触发了一个事件(click),它让一个操作触发并将一些额外的数据作为数组中的对象发送。当我第一次单击该操作时,该操作会对数组中的一个对象进行一次分派(结果1:一个新对象)——这很好 但现在不想要的事情发生了: 当我第二次单击调用新的附加数据时,操作会发送两次—第一次是以前调用的状态数据(结果1)—第二次是新调用的状态数据(结果2:包含新数据的两个相同对象)。现在有三个对象处于状态 当我再次单击第三次调用新

我在Redux中遇到了以下不必要的行为(React/Redux+Redux-thunk):我触发了一个事件(click),它让一个操作触发并将一些额外的数据作为数组中的对象发送。当我第一次单击该操作时,该操作会对数组中的一个对象进行一次分派(结果1:一个新对象)——这很好

但现在不想要的事情发生了:

当我第二次单击调用新的附加数据时,操作会发送两次—第一次是以前调用的状态数据(结果1)—第二次是新调用的状态数据(结果2:包含新数据的两个相同对象)。现在有三个对象处于状态

当我再次单击第三次调用新数据时,操作会发送三次,第一次发送结果1,第二次发送结果2,第三次发送状态为再次调用的数据(结果3:三个相同的对象包含新数据)。现在有六个对象处于状态

……等等

我的期望是:操作应该总是触发一次,并且reducer应该相应地添加一次新的数据对象,从而使对象的数量始终等于单击的数量

下面是一些代码:

行动:

export function getData(idData) {
    return function (dispatch, getState) {
        dispatch({type: "FETCHING_DATA"});
        const socket = getState().socket.socket;
        socket.emit("requestData", idData);
        socket.on("responseData", function(newData){
            console.log("TRIGGER");
            dispatch({type: "GET_DATA", payload: newData});
        });
    }
}
减速器:

export function priceMonitorReducers(
    state={
        data: [],
        isFetchingData: false,
    }, action) {
    switch (action.type) {
        case "FETCHING_DATA":
            return {...state, isFetchingData: true};
            break;
        case "GET_DATA":
            return {...state,
                data: [...state.data, action.payload],
                isFetchingData: false };
            break;
    }
    return state;
}
组成部分:

onGetData = (idData) => {
    this.props.getData(idData);
};

function mapStateToProps(state) {
    return {
        data: state.data,
        ...
    }
}

function mapDispatchToProps(dispatch) {
    return bindActionCreators({
        getData: getData
        ...
    }, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(Journey);

我哪里做错了,哪里期待错了?非常感谢你的帮助

在每次调用
getData
时,您都要向套接字注册一个额外的事件处理程序。相反,您应该在初始化时只注册一个处理程序,并且在
getData
中只注册
emit
,在我的例子中,我使用的是redux saga,我的saga中间件启动了很多次,即使操作只启动了一次。我改变了我的传奇效果:

export default function* watchLogin() {
    while(true) {
        yield takeEvery(LOGIN, serverCreateInitialUser);  
    }
} 
为此:

export default function* watchLogin() {
    yield takeLatest(LOGIN, serverCreateInitialUser);  
}

这不完全是对问题的回答,但由于我发现这个问题是由于我的类似问题,我希望它能帮助别人。

您能分享您的组件的所有代码吗?我们需要查看单击处理程序以及它在组件中的调用位置。谢谢Matt。单击处理程序不是问题所在。我接受了一个答案,解决了我的错误。谢谢!!在
store=createStore(…)
socket.on(“responseData”,function(data){store.dispatch({type:“GET_data”,payload:data});})之后的
client.js中是这样的意思类似的东西,是的。您还可以对其执行thunk操作,并在初始化期间发送一次。这取决于你的项目是如何组织的。它起作用了。还没有使用thunk操作。我会调查的。非常感谢你!!