繁体   English   中英

Next.js 与 firebase onAuthStateChanged

[英]Next.js with firebase onAuthStateChanged

function useAuth() {
  const [user, setUser] = useState('');

  useEffect(() => {
    auth.onAuthStateChanged(function handleAuth(user) {
      if (user) {
        setUser(user);
      } else {
        setUser(null);
      }
    });
  }, [user]);

  return user;
}



import useAuth from '../components/useAuth';
function MyApp({ Component, pageProps }) {
  const user = useAuth();

  return (
    <Fragment>
      <Head>
        <title>whatsapp</title>
        <meta name="description" content="whatsapp by create next app" />
        <link rel="icon" href="\whatsapp--v1.png" />
      </Head>
      {!user ? <Login /> : <Component {...pageProps} />}
    </Fragment>
  );
}

我想检查是否有用户然后 go 到 login.js 页面,如果没有 go 到 index.js。 但是有一个问题:用户一开始变成null 然后有一个值,这会导致延迟,即使有用户,登录页面总是先出现一秒钟然后索引页面。 如何在用户数据完全加载后进行渲染?

您可以定义一个加载 state 并在您获取数据时呈现它应该是这样的:



function useAuth() {
  const [user, setUser] = useState('');
  const [loading, setLoading] = useState(false);
  
  useEffect(() => {
    setLoading(true)
    auth.onAuthStateChanged(function handleAuth(user) {
      if (user) {
        setUser(user);
        setLoading(false);
      } else {
        setUser(null);
        setLoading(false)
      }
    });
  }, [user]);

  return {user, loading};
}



import useAuth from '../components/useAuth';
function MyApp({ Component, pageProps }) {
  const auth = useAuth();
  if(auth.loading) return 'loading...'
  return (
    <Fragment>
      <Head>
        <title>whatsapp</title>
        <meta name="description" content="whatsapp by create next app" />
        <link rel="icon" href="\whatsapp--v1.png" />
      </Head>
      {!auth?.user ? <Login /> : <Component {...pageProps} />}
    </Fragment>
  );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM