То, что я бы порекомендовал здесь, - это создать пользовательский хук, который использует контекстный API React для того, чтобы «отслеживать» изменение состояния авторизации. Затем оберните ваше приложение в этом поставщике, и вы сможете гибко делать все что угодно с этим состоянием аутентификации, используя свой новый пользовательский хук.
Вот пример того, как этот пользовательский хук будет выглядеть при использовании аутентификации с Firebase:
import React, { createContext, useContext, useState } from 'react'
import { auth } from './services' // this is just firebase.auth()
const UserContext = createContext()
export const UserProvider = ({ children }) => {
const [user, setUser] = useState(undefined)
auth.onAuthStateChanged(setUser)
return <UserContext.Provider value={user}>{children}</UserContext.Provider>
}
export const useUser = () => useContext(UserContext)
Теперь вам просто нужно обернуть ваше приложение в UserProvider
.
Примерно так:
import React, { StrictMode } from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter } from 'react-router-dom'
import App from './app'
import { UserProvider } from './hooks'
const rootElement = document.getElementById('root')
ReactDOM.render(
<StrictMode>
<BrowserRouter>
<UserProvider>
<App />
</UserProvider>
</BrowserRouter>
</StrictMode>,
rootElement
)
Тогда в качестве примера, скажем, вы хотели чтобы автоматически перейти от вашей страницы входа в систему, если использование зарегистрировано это. Вы можете использовать ловушки useEffect
и useHistory
для перехода к /
, если пользователь вошел в систему.
Что-то вроде этого будет делать:
import React, { useEffect } from 'react'
import { useHistory } from 'react-router-dom'
import { useUser } from './hooks'
const LoginPage = () => {
const history = useHistory()
const user = useUser() // user is undefined if not logged in
useEffect(() => {
if (user) { // will run the condition if user exists
history.push('/')
}
}, [user])
...
}
Вы можете go на самом деле использовать user
данные на панели навигации, используя что-то вроде этого:
import React from 'react'
import { Link } from 'react-router-dom'
import { useUser } from './hooks'
const NavBar = () => {
const user = useUser()
return (
<div>
{user ?
<Link to="/profile">Welcome, {user.displayName}</Link> :
<Link to="/login">Login</Link>
}
</div>
)
}
Очевидно, вы можете изменить это для нас в соответствии со своими потребностями, но все это должно получить вы идете с тем, как работать с состоянием аутентификации в чистой надежной манере.