Это потому, что useEffect
будет запускаться только после установки компонента. Вы можете использовать разные решения:
- Условный рендеринг , добавьте поле загрузки для состояния, которое по умолчанию истинно, когда это правда, ваш компонент будет отображать что-то вроде счетчика / загрузки компонент, если
isAuth()
вернет false, вы отобразите что-то еще (скорее всего, форму входа). Псевдокод :
const SigninComponent = () => {
const [loading, setLoading] = useState(true);
useEffect(() => {
if(isAuth()){
Router.push(`/`);
}else{
setLoading(false)
}
}, []);
if(!loading){
return <Login />
}else{
return <MyloaderComponent />
}
}
Используйте HO C компонент , аналогично приведенному выше, но вы оберните вышеуказанный logi c в HO C компонент
Используйте getServerSideProps
и запустите
isAuth()
на стороне сервера вместо этого на стороне клиента, если вы перенаправляете внутрь
getServerSideProps
, компонент вообще не будет отображаться. (вы можете использовать
getServerSideProps
только на страницах)
export const getServerSideProps = async (ctx) => {
const auth = await isAuth() // or other any logic, like read cookies...
if (!auth) {
const { res } = ctx;
res.setHeader("location", "/");
res.statusCode = 302;
res.end();
return;
}
return {
props: {}, // or return user
};
};