redux调度多次开火
我在Redux中遇到了以下不必要的行为(React/Redux+Redux-thunk):我触发了一个事件(click),它让一个操作触发并将一些额外的数据作为数组中的对象发送。当我第一次单击该操作时,该操作会对数组中的一个对象进行一次分派(结果1:一个新对象)——这很好 但现在不想要的事情发生了: 当我第二次单击调用新的附加数据时,操作会发送两次—第一次是以前调用的状态数据(结果1)—第二次是新调用的状态数据(结果2:包含新数据的两个相同对象)。现在有三个对象处于状态 当我再次单击第三次调用新数据时,操作会发送三次,第一次发送结果1,第二次发送结果2,第三次发送状态为再次调用的数据(结果3:三个相同的对象包含新数据)。现在有六个对象处于状态 ……等等 我的期望是:操作应该总是触发一次,并且reducer应该相应地添加一次新的数据对象,从而使对象的数量始终等于单击的数量 下面是一些代码: 行动:redux调度多次开火,redux,react-redux,redux-thunk,Redux,React Redux,Redux Thunk,我在Redux中遇到了以下不必要的行为(React/Redux+Redux-thunk):我触发了一个事件(click),它让一个操作触发并将一些额外的数据作为数组中的对象发送。当我第一次单击该操作时,该操作会对数组中的一个对象进行一次分派(结果1:一个新对象)——这很好 但现在不想要的事情发生了: 当我第二次单击调用新的附加数据时,操作会发送两次—第一次是以前调用的状态数据(结果1)—第二次是新调用的状态数据(结果2:包含新数据的两个相同对象)。现在有三个对象处于状态 当我再次单击第三次调用新
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操作。我会调查的。非常感谢你!!