#reactjs #react-router-dom #aws-amplify
#reactjs #react-router-dom #aws-amplify
Вопрос:
Здравствуйте, я пытаюсь перенаправить и изменить свой путь после входа в систему с помощью AWS-amplify и с помощью react-dom
Мне нужно после входа пользователя перенаправить их на localhost/main
main, потому что его порог в localhost/
Если у кого-нибудь есть идея, я могу поблагодарить вас за мой код:
import React from "react";
import "./App.css";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Amplify from "aws-amplify";
import {
AmplifyAuthenticator,
AmplifySignUp,
} from "@aws-amplify/ui-react";
import { AuthState, onAuthUIStateChange } from "@aws-amplify/ui-components";
import awsconfig from "./aws-exports";
import Main from "./main";
Amplify.configure(awsconfig);
const AuthStateApp = () => {
const [authState, setAuthState] = React.useState();
const [user, setUser] = React.useState();
React.useEffect(() => {
return onAuthUIStateChange((nextAuthState, authData) => {
setAuthState(nextAuthState);
setUser(authData);
});
}, []);
return authState === AuthState.SignedIn amp;amp; user ? (
<Router>
<Switch>
<Route path="/main">
<Main />
</Route>
</Switch>
</Router>
) : (
<AmplifyAuthenticator>
<AmplifySignUp
slot="sign-up"
formFields={[
{ type: "username" },
{ type: "password" },
{ type: "email" },
]}
/>
</AmplifyAuthenticator>
);
};
export default AuthStateApp;
Ответ №1:
после поиска по этой проблеме решение состоит в том, чтобы создать свой собственный дизайн для входа и регистрации с помощью AUTH.signIn()
and Auth.signUp()
, и вы можете перенаправить после.
Ответ №2:
Я использую angular, но я думаю, что это может быть похоже
onAuthUIStateChange((authState, authData) => {
console.log('LoginPage', authState, authData);
if (this.authState == AuthState.SignedIn) {
this.router.navigate(['']);
}
});
Ответ №3:
Обычно я делаю так:
- оберните
<router>
с<AwsAuthenticator>
помощью компонента, который вы будете использовать для проверки и требовать аутентификации. - В AwsAuthenticator.tsx (или js, если вы не используете typescript) вы сделаете это:
// @ts-ignore
import {Authenticator} from 'aws-amplify-react-native';
import React, {ReactNode, useState} from 'react';
import {signUpConfig} from '@app/components/Authentication/SignUpForm.config';
interface AwsAuthenticatorProps {
children: ReactNode;
}
export const AwsAuthenticator = ({children}: AwsAuthenticatorProps) => {
const [loggedIn, setLoggedIn] = useState<boolean>(false);
// possible states: signIn | signedIn | signedOut
const handleAuthStateChange = (authState: string) =>
authState === 'signedIn' ? setLoggedIn(true) : setLoggedIn(false);
return loggedIn ? (
<>{children}</>
) : (
<Authenticator
usernameAttributes="email"
signUpConfig={signUpConfig}
onStateChange={handleAuthStateChange}
/>
);
};
Ответ №4:
Это сработало для меня, но оно будет перенаправлять вас на / main каждый раз, когда вы обновляете страницу, а не только после входа в систему.
Просто импортируйте useNavigate для подключения react-router-dom, установите для него переменную, а затем вызовите ее внутри useEffect
Посмотрите, как это реализовано в вашем коде
import React from "react";
import "./App.css";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Amplify from "aws-amplify";
import {
AmplifyAuthenticator,
AmplifySignUp,
} from "@aws-amplify/ui-react";
import { AuthState, onAuthUIStateChange } from "@aws-amplify/ui-components";
import awsconfig from "./aws-exports";
import Main from "./main";
import { useNavigate } from "react-router-dom";
Amplify.configure(awsconfig);
const AuthStateApp = () => {
const [authState, setAuthState] = React.useState();
const [user, setUser] = React.useState();
const navigate = useNavigate();
React.useEffect(() => {
return onAuthUIStateChange((nextAuthState, authData) => {
setAuthState(nextAuthState);
setUser(authData);
navigate("/main");
});
}, []);
return authState === AuthState.SignedIn amp;amp; user ? (
<Router>
<Switch>
<Route path="/main">
<Main />
</Route>
</Switch>
</Router>
) : (
<AmplifyAuthenticator>
<AmplifySignUp
slot="sign-up"
formFields={[
{ type: "username" },
{ type: "password" },
{ type: "email" },
]}
/>
</AmplifyAuthenticator>
);
};
export default AuthStateApp;