Javascript React useffect和componentWillUnmount with Redux

Javascript React useffect和componentWillUnmount with Redux,javascript,reactjs,redux,Javascript,Reactjs,Redux,有一个个人资料页。这里的props.profile()。它更新Redux存储,并基本上将用户添加到状态。还有一个注销按钮。注销后,它会重定向到主页,操作和还原程序会清除Redux状态并从localStorage中删除令牌 如果我在配置文件加载之前转到我的配置文件页面并注销,那么即使我已经单击了注销按钮,props.profile()仍然会加载。喜欢 我认为我的useffect有问题,因为单击logout按钮时组件没有卸载 useEffect(() => { props.pr

有一个个人资料页。这里的
props.profile()。它更新Redux存储,并基本上将用户添加到状态。还有一个
注销
按钮。注销后,它会重定向到主页,操作和还原程序会清除Redux状态并从localStorage中删除令牌

如果我在配置文件加载之前转到我的配置文件页面并注销,那么即使我已经单击了
注销
按钮,
props.profile()
仍然会加载。喜欢

我认为我的
useffect
有问题,因为单击
logout
按钮时组件没有卸载

useEffect(() => {
        props.profile();

        return;
    }, [props]);
有一个
返回也是,但我不知道该怎么办

所需结果:如果单击注销,我希望卸载组件并清除状态

注销操作:

export const logout = () => (dispatch) => {
    localStorage.removeItem("token");
    dispatch({
        type: LOGOUT,
    });
};
注销还原程序:

case LOGOUT:
            return {
                user: {},
                authenticated: false,
                loading: false,
                error: null,
                token: null,
            };

无论
useffect
中的
return
如何,组件总是卸载。没有发生的是卸载时调用的某些内容

尝试将代码更改为以下内容:

useEffect(() => {
        props.profile();

        return () => props.logout(); //logout should be your redux action
    }, [props.profile, props.logout]); // Reduce triggers of this method by not leaving `props` here

useffect
return
功能将用于任何清理-只要你进入
profile页面
它就会调用
useffect
,它的操作非常快,我想你不能在调用它之前注销。为了测试的目的,我在profile页面上放置了
logout
按钮可以在运行
props.profile()
之前快速单击它。然后它将我注销,但
props.profile()
仍在之后运行。问题仍然存在。我转到我的个人资料页面,它会加载我的个人资料页面,但是如果我在加载
props.profile()
之前单击
logout
按钮,那么即使在注销之后,它也会加载个人资料并将数据放入Redux存储。@David我已经对代码添加了一些更改,你能再试一次吗?@David如果你的页面是通过导航库挂载的,那么在你交换页面时,该页面很有可能没有真正卸载。是的,我使用react router dom和。更新后的代码是:我在/profile上,但如果我转到/feed,它会自动将我注销。那么我应该如何卸载它呢?因为你有这个
[props.profile,props.logout]
。即使是对配置文件(prop.profile)的更改,也可能会触发注销。