【问题标题】:Firebase v9 onAuthStateChanged only fires on initializationFirebase v9 onAuthStateChanged 仅在初始化时触发
【发布时间】:2021-12-06 13:21:35
【问题描述】:

我正在将我的 React 应用程序迁移到 firebase v9。目前我正在研究身份验证上下文。
问题在于onAuthStateChanged() 回调仅在初始化期间触发一次,而不会在signInWithEmailAndPassword()signOut() 上触发。刷新页面显示身份验证状态确实发生了变化,只有侦听器不会触发。

v9 中是否有任何可能导致此问题的更改,还是我遗漏了什么?

上下文
AuthContext.jsx

export const AuthContext = createContext(undefined);

export const AuthWrapper = ({ children }) => {
  const [user, setUser] = useState(undefined);

  useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
      setUser(currentUser);
    });
    return unsubscribe();
  }, []);

  return <AuthContext.Provider value={user}>{children}</AuthContext.Provider>;
};

用法
index.jsx

import { AuthWrapper } from "./context/AuthContext";

ReactDOM.render(
  <React.StrictMode>
    <AuthWrapper>
      <App />
    </AuthWrapper>
  </React.StrictMode>,
  document.getElementById("root")

App.jsx

import { useContext } from "react";
import { AuthContext } from "./context/AuthContext";

function App() {
  const user = useContext(AuthContext);

  return <>{user ? <Dashboard /> : <Landing />}</>
}

【问题讨论】:

    标签: reactjs firebase firebase-authentication react-hooks


    【解决方案1】:

    我认为你的清理效果设置是错误的。

      useEffect(() => {
        const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
          setUser(currentUser);
        });
        // to fix:
        return () => { unsubscribe() }
        // equivalent to:
        return unsubscribe
        // but not:
        return unsubscribe(); // it cleans up immediately after the first call
      }, []);
    

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2016-10-07
      相关资源
      最近更新 更多