【发布时间】:2021-03-18 15:29:22
【问题描述】:
我正在尝试使用响应中的 AWS Amplify 库从经过身份验证的 AWS Cognito 用户池中获取用户信息。
在我从应用程序注销后,以下代码会显示以下控制台错误消息:
警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。 app@http://localhost:3000/static/js/main.chunk.js:211:82
不幸的是,我不是前端专家,react-hooks 文档让我头疼。
我的第一次尝试是创建 2 个单独的 useEffect 块,但它抱怨 user 未定义。我在这里做错了什么?
import React from "react";
import Amplify from "aws-amplify";
import {
AmplifyAuthenticator,
AmplifySignOut,
withAuthenticator,
} from "@aws-amplify/ui-react";
import { AuthState, onAuthUIStateChange } from "@aws-amplify/ui-components";
Amplify.configure({
Auth: {
region: "...",
userPoolId: "...",
userPoolWebClientId: "...",
},
});
const App = () => {
const [authState, setAuthState] = React.useState();
const [user, setUser] = React.useState();
const [userGroup, setUserGroup] = React.useState();
React.useEffect(() => {
onAuthUIStateChange((nextAuthState, authData) => {
setAuthState(nextAuthState);
setUser(authData);
if (authData !== undefined) {
setUserGroup(authData.signInUserSession.accessToken.payload["cognito:groups"]);
}
console.log("user data: ", authData);
});
}, []);
return authState === AuthState.SignedIn && user ? (
<div>
<AmplifySignOut />
<div>Hello {user.username} from {userGroup}</div>
</div>
) : (
<AmplifyAuthenticator />
);
};
export default withAuthenticator(App);
【问题讨论】:
-
可能是组件挂载前的
onAuthUIStateChange调用,所以在回调setUserGroup, setAuthState, setUser中会导致控制台报错。onAuthUIStateCHange是做什么的?当节点包中的AuthState发生变化时是否调用? -
这是我能找到的关于这个回调的尽可能多的文档。 docs.amplify.aws/ui/auth/authenticator/q/framework/…
-
没有
return ()可以试试吗? -
您没有在监听事件,您只是使用了在 authState 更改时触发的方法。所以 useEffect 没有什么要清除的。
标签: javascript reactjs react-hooks aws-amplify