reactjs - 页面刷新时 Firebase onAuthStateChange 返回未定义

标签 reactjs firebase react-hooks firebase-authentication react-router

刷新页面时,Firebase onAuthStateChange 返回的第一个结果为未定义。因此,我无法检查用户是否经过身份验证。

我的 useAuth Hook :

export default function useAuth() {
  const [authUser, setAuthUser] = useState();

  const user = useFirebase();

  useEffect(() => {
    onAuthStateChanged(user.auth, (user) => {
      user ? setAuthUser(user) : setAuthUser(false);
    });
  }, [user]);

  return authUser;
}

当我尝试刷新页面时,用户的第一个结果未定义,结束后我得到结果。

enter image description here

function App() {
  const authUser = useAuth();

  console.log("au", authUser);

  return (
    <div className="App">
      <Routes>
        <Route exact path="/" element={<HomePage />} />
        <Route path="/blogs" element={<BlogsPage />} />
        <Route path="/blog/:id" element={<SingleBlogPage />} />
        <Route path="/contact" element={<ContactPage />} />
        <Route path="/login" element={<AdminLogin />} />
        <Route
          path="/admin"
          element={authUser ? <Dashboard /> : <Navigate to="/vanja-login" />}
        >
          <Route exact path="dashboard" element={<Settings />} />
        </Route>
      </Routes>
      <Footer />
    </div>
  );
}

最佳答案

初始渲染的初始 authUser 状态未定义,因此这是预期的行为。 onAuthStateChanged 监听器在初始渲染周期结束时通过 useEffect 实例化。如果您的 UI 的任何部分依赖于这种“不确定的”authUser 状态,它应该相应地处理它。

此外,当组件卸载或 user 对象从 Firebase 更新/更改时,您还应该取消订阅任何身份验证状态监听器。

示例:

export default function useAuth() {
  const [authUser, setAuthUser] = useState();

  const user = useFirebase();

  useEffect(() => {
    const unsubscribe = onAuthStateChanged(
      user.auth,
      (user) => setAuthUser(user ?? false)
    );

    return unsubscribe;
  }, [user]);

  return authUser;
}

...

const AuthLayout = () => {
  const authUser = useAuth();

  console.log("au", authUser);

  if (authUser === undefined) {
    return null; // or loading spinner, etc...
  }

  return authUser ? <Outlet /> : <Navigate to="/vanja-login" />;
};

...

function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<HomePage />} />
        <Route path="/blogs" element={<BlogsPage />} />
        <Route path="/blog/:id" element={<SingleBlogPage />} />
        <Route path="/contact" element={<ContactPage />} />
        <Route path="/login" element={<AdminLogin />} />
        <Route path="/admin" element={<AuthLayout />}>
          <Route index element={<Dashboard />} />
          <Route path="dashboard" element={<Settings />} />
        </Route>
      </Routes>
      <Footer />
    </div>
  );
}

关于reactjs - 页面刷新时 Firebase onAuthStateChange 返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71526028/

相关文章:

android - dataSnapshot 有对象,但 getValue() 将返回 null

ios - 如何提示用户在 AppDelegate 之外接受推送通知?

javascript - 使用 React hook setState 更改数组中的变量

react-native - 在 react-native 中自动播放关于元素焦点的视频

javascript - 重定向后未存储 useState 值

reactjs - 是否可以根据子组件 props 推断父组件 props

reactjs - autoHideDuration 在 Snackbar @material-ui 中不起作用

android - 火力地堡用户界面 : How to add new message to the top of recycleView

reactjs - Redux 和 Context API 在同一个 React Native 项目中一起使用

javascript - React.js - 创建简单的 Accordion 示例