PL
React - proste logowanie / wylogowanie
3
points
W tym artykule chcielibyśmy pokazać, jak stworzyć prostą usługę logowania/wylogowania w React.
W poniższym przykładzie tworzymy obiekt AuthenticationContext
, który pozwala nam dzielić kontekst między komponentami potomnymi. Kontekst pozwala nam dzielić się pewnymi informacjami między komponentami bez konieczności używania właściwośći - wszystkie komponenty potomne mają dostęp do kontekstu rodzica.
Używając AuthenticationContext.Provider
możemy udostępnić wszystkim dzieciom obiekt authenticationService
. Aby mieć dostęp do authenticationService
w każdym z komponentów potomnych, należy wywołać useContext(AuthenticationContext)
.
- Komponent funkcyjny
UserMenu
to pierwszy komponent, który używa naszegoAuthenticationContext
zainicjowanego wApp
. Za pomocą przycisków i przypisanym im metodonClick
możemy zalogować lub wylogować naszego użytkownika poprzez aktualizacjęAuthenticationContext
. - Komponent
SiteNavbar
jest drugim komponentem, który używaAuthenticationContext
.
Wyświetla on naszego użytkownika używając metodygetUser()
z naszegoauthenticationService
i renderuje komponentUserMenu
. - Dane użytkownika są przechowywane w stanie komponentu
App
, dzięki temu w przypadku zmiany danych wystąpi ponowne renderowanie wszystkich komponentów.
// ONLINE-RUNNER:browser;
//import React from 'react';
//import ReactDOM from 'react-dom';
const AuthenticationContext = React.createContext();
const UserMenu = () => {
const authenticationService = React.useContext(AuthenticationContext);
const handleLoginClick = () => authenticationService.loginUser('Jacek');
const handleLogoutClick = () => authenticationService.logoutUser();
return (
<>
<button onClick={handleLoginClick}>Zaloguj: Jacek</button>
<button onClick={handleLogoutClick}>Wyloguj: Jacek</button>
</>
);
};
const SiteNavbar = () => {
const authenticationService = React.useContext(AuthenticationContext);
return (
<div>
<span>{authenticationService.getUser()}</span>
<UserMenu />
</div>
);
};
const App = () => {
const [user, setUser] = React.useState(null);
const authenticationService = {
getUser: () => user,
loginUser: (user) => {
//TODO: Zastąp setUser zapytaniami AJAX do serwera
setUser(user);
return true;
},
logoutUser: () => {
//TODO: Zastąp setUser zapytaniami AJAX do serwera
setUser(null);
return true;
}
// inne metody...
};
return (
<AuthenticationContext.Provider value={authenticationService}>
<SiteNavbar />
</AuthenticationContext.Provider>
);
};
const root = document.querySelector('#root');
ReactDOM.render(<App />, root);