¿Cómo se llama useContext en React sin romper las reglas de hooks?
Estoy tratando de entender cómo llamar a una función de inicio de sesión para Google o Github dentro de mi proveedor de contexto.
¿Cuál es la forma adecuada de llamar a un proveedor de contexto en Next JS sin romper la regla de los hooks?
// user.js
const Context = createContext();
const Provider = ({ children }) => {
const [user, setUser] = useState(supabase.auth.user());
const [isLoading, setIsLoading] = useState(true);
const router = useRouter();
useEffect(() => {
const getUserProfile = async () => {
const sessionUser = supabase.auth.user();
if (sessionUser) {
//removido por brevedad
setUser({
...sessionUser,
...profile,
});
setIsLoading(false);
}
};
getUserProfile();
supabase.auth.onAuthStateChange(() => {
getUserProfile();
});
}, []);
const githubLogin = async () => {
await supabase.auth.signIn({
provider: "github",
});
};
const googleLogin = async () => {
await supabase.auth.signIn({
provider: "google",
});
};
const logout = async () => {
await supabase.auth.signOut();
setUser(null);
router.push("/");
};
const exposed = {
user,
googleLogin,
githubLogin,
logout,
isLoading,
};
return <context.provider value="{exposed}">{children}</context.provider>;
};
export const useUser = () => useContext(Context);
export default Provider;
y mi página de inicio de sesión
// login.js
const Login = () => {
const handleGithubLogin = () => {
const { githubLogin } = useUser();
useEffect(githubLogin, []);
}
const handleGoogleLogin = () => {
const { googleLogin } = useUser();
useEffect(googleLogin, []);
};
return (
<div>
<button onclick="{handleGithubLogin}">Iniciar sesión con Github</button>
<button onclick="{handleGoogleLogin}">Iniciar sesión con Google</button>
</div>
);
}
export default Login;
¿Cómo puedo llamar a estas funciones de inicio de sesión sin romper las reglas de los hooks? ¿Cuál es la mejor manera de llamar a un proveedor de contexto desde mi página de inicio de sesión?
davy.ai
Para llamar a las funciones de inicio de sesión sin romper la regla de los hooks, no debes llamar a los hooks dentro de una función o una declaración condicional. En su lugar, puedes utilizar el hook
useEffect
para llamar a la función de inicio de sesión cuando el componente se monte.En tu página de inicio de sesión, puedes modificar las funciones
handleGithubLogin
yhandleGoogleLogin
para utilizar el hookuseEffect
de la siguiente manera:De esta manera, las funciones de inicio de sesión se llamarán solo una vez cuando el componente se monte y no romperás la regla de los hooks.
Para llamar a un proveedor de contexto desde tu página de inicio de sesión, puedes utilizar el hook
useContext
para obtener el valor del contexto.Ten en cuenta que la variable
Contexto
debe ser exportada desde tu archivouser.js
para que pueda ser importada y utilizada en otros archivos.