firebase.auth().onAuthStateChanged 无限循环

亚历克斯·艾恩赛德

我有这个代码:

function App() {
  const { setUser } = useContext(UserContext);
  firebase.auth().onAuthStateChanged((user) => {
    console.log("test");
    if (user) {
      console.log("user");
      setUser({ id: user.uid, email: "" });
    } else {
      console.log("null");
      setUser(null);
    }
  });

  return (
    <Container>
      <Router />
    </Container>
  );
}

用户上下文:

const initialState = {
  email: null,
  id: null,
};

export interface IUserContext {
  user: IUser | null;
  setUser: React.Dispatch<IUser | null>;
}

export const UserContext = createContext<IUserContext>({
  user: initialState,
  setUser: () => {},
});

interface IUserContextProvider {
  children: JSX.Element;
}
export function UserContextProvider({ children }: IUserContextProvider) {
  const [user, setUser] = useState<IUser | null>(initialState);
  return (
    <UserContext.Provider value={{ user, setUser }}>
      {children}
    </UserContext.Provider>
  );
}

我正在尝试在登录或注销时设置用户对象。问题是这会无限循环。我如何阻止这种情况发生?我基本上只是想知道某人何时登录或注销。

拉克夏·塔库尔

这可能是您的Provider本身的责任,并在其内部运行useEffect如下:-


export function UserContextProvider({ children }: IUserContextProvider) {
  const [user, setUser] = useState<IUser | null>(initialState);

useEffect(()=>{
   const unsubscribe = firebase.auth().onAuthStateChanged((user) => {
    console.log("test");
    if (user) {
      console.log("user");
      setUser({ id: user.uid, email: "" });
    } else {
      console.log("null");
      setUser(null);
    }
  });
 return unsubscribe;
},[])

  return (
    <UserContext.Provider value={{ user, setUser }}>
      {children}
    </UserContext.Provider>
  );
}

onAuthStateChanged只需要注册一次,因此[]依赖阵列useEffect是它的正确的地方。unsubscribe只会工作时,该组件卸除,除非你退出网站,这将不会发生你。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Flutter:Firebase Auth 无限循环

如何使用Firebase Auth获取流onAuthStateChanged?

在哪里放置firebase.auth()。onAuthStateChanged()

在$ onAuthStateChanged上找到正确的Firebase Auth id_token

在Vuejs中将firebase.auth()。onAuthStateChanged()放在哪里

Firebase中的auth.currentUser.updateProfile之后未触发auth.onAuthStateChanged

加载React应用时如何设置运行的Firebase auth onAuthStateChanged()侦听器运行?

Firebase Auth的onAuthStateChanged中的React的SetState导致setState未定义

刷新页面时,有时firebase.auth()。onAuthStateChanged返回null的用户

firebase.auth()。onAuthStateChanged()在React Native中返回未定义

Firebase停止监听onAuthStateChanged

我如何使用firebase.auth()。onAuthStateChanged()返回我的userID的值,它当前返回未定义的

Redux传奇Firebase onAuthStateChanged eventChannel

Firebase onAuthStateChanged取消订阅递归

Vue 3 + Firebase onAuthStateChanged 挂载

我们是否应该在 firebase 中使用 Auth.onAuthStateChanged() 返回的取消订阅方法来清理内存泄漏?

Firebase Authenticatoin-多次调用onAuthStateChanged

Firebase Cloud函数无限循环调用

Firebase onAuthStateChanged在登录时被调用两次

AuthGuard:Angular 5 + Firebase 中的 OnAuthStateChanged VS 检查令牌

将回调附加到onauthStateChanged侦听器firebase

Firebase身份验证onAuthStateChanged在函数主体后响应

.onAuthStateChanged方法是否计入Firebase身份验证?

如何使用Firebase的onAuthStateChanged跟踪Angular中的用户登录状态?

React-Native-Firebase onAuthStateChanged无法正常工作

使用Kotlin和Firebase通过onAuthStateChanged回调触发sendEmailVerification

在Firebase的onAuthStateChanged()中使用异步/等待的最佳方法是什么?

为什么我需要在Firebase中退订`onAuthStateChanged`

firebase onAuthStateChanged 遵循斐波那契数列