我有这个代码:
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] 删除。
我来说两句