Javascript 组件卸载时清除重复使用状态取消useEffect清理函数中的所有订阅和异步任务
伙计们,我想在卸载组件时将redux状态清除为初始值,但我遇到了这个错误 无法对未安装的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务 这是我的密码 signup.jsJavascript 组件卸载时清除重复使用状态取消useEffect清理函数中的所有订阅和异步任务,javascript,reactjs,Javascript,Reactjs,伙计们,我想在卸载组件时将redux状态清除为初始值,但我遇到了这个错误 无法对未安装的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务 这是我的密码 signup.js useEffect(() => { if (cookies?.resentTimes?.num >= 3) { setResentTimes(3); setAttempts(3);
useEffect(() => {
if (cookies?.resentTimes?.num >= 3) {
setResentTimes(3);
setAttempts(3);
}
return () => {
signupCleanup();
console.log("cleaned up");
};
}, []);
signup.actions.js
export const signupCleanup = () => ({
type: Types.SIGNUP_CLEANUP,
});
signup.reducer.js
export default function signup(state = initialState.auth.signup, action) {
switch (action.type) {
case CHECK_DOMAIN:
return {
...state,
checkingDomainStart: true,
checkingDomainError: null,
};
case CHECK_DOMAIN_FAILURE:
return {
...state,
checkingDomainStart: false,
checkingDomainError: action.payload.error,
};
case CHECK_DOMAIN_SUCCESS:
return {
...state,
checkingDomainStart: false,
checkDomainRes: action.payload.res,
};
case CHECK_EMAIL:
return {
...state,
checkingEmailStart: true,
checkingEmailError: null,
};
case CHECK_EMAIL_FAILURE:
return {
...state,
checkingEmailStart: false,
checkingEmailError: action.payload.error,
};
case CHECK_EMAIL_SUCCESS:
return {
...state,
checkingEmailStart: false,
checkEmailRes: action.payload.res,
};
case VERIFY_CODE:
return {
...state,
verifyingCodeStart: true,
verifyingCodeError: null,
};
case VERIFY_CODE_FAILURE:
return {
...state,
verifyingCodeStart: false,
verifyingCodeError: action.payload.error,
}
case VERIFY_CODE_SUCCESS:
return {
...state,
verifyingCodeStart: false,
token: action.payload.token,
}
case SET_PASSWORD:
return {
...state,
settingPasswordStart: true,
settingPasswordError: null,
}
case SET_PASSWORD_FAILURE:
return {
...state,
settingPasswordStart: false,
settingPasswordError: action.payload.error,
}
case SET_PASSWORD_SUCCESS:
return {
...state,
settingPasswordStart: false,
settingPasswordResponse: action.payload.res,
}
case SIGNUP_CLEANUP:
return {
...state,
settingPasswordResponse: null,
settingPasswordError: null,
token: null,
verifyingCodeError: null,
checkingEmailError: null,
checkEmailRes: null,
checkDomainRes: null,
checkingDomainError: null,
}
default:
return state;
}
}您的组件具有本地
状态
,该状态取决于Redux存储更改。当您调用signupCleanup
函数时,它最终会尝试更新组件的本地状态。您应该使用redux dispatch来调用redux操作,而您共享的代码中似乎没有这种情况()@StavrosAngelis发生这种情况是因为我在卸载组件时使用了signupCleanup操作,而在卸载组件时我不应该使用异步操作,但我不知道在哪里可以将redux状态重置为组件中的初始值,因为代码“signupCleanup”似乎不是异步函数。如果我从您共享的代码中理解正确,您只需在redux状态中重置一些值。如果是这种情况,则无需将“signupCleanup”作为异步函数运行。@StavrosAngelis是的,您是对的,它是同步的,但如何在组件清理时将redux重置为初始值