useEffect hook infinite loop
Eu sou novo para reagir. aqui está o meu problema
import React, { useEffect, useState } from "react";
import { useJwt } from "react-jwt";
import { get_single_user_url } from "../../store/api";
import UrlCard from "../UrlCard/UrlCard";
import "./Urls.css";
function Urls() {
const [urls, setUrls] = useState([]);
const { decodedToken } = useJwt(localStorage.token);
const userId = decodedToken !== null ? decodedToken.userId : "";
useEffect(() => {
const hit = async (userId) => {
get_single_user_url(userId).then((data) => setUrls(data));
const data = await get_single_user_url(userId);
setUrls(data);
console.log(data);
};
hit(userId);
}, []);
return <div className="urls"></div>;
}
export default Urls;
então este efeito de uso irá chamar uma função
get_single_user_data (userId)
e deve retornar uma matriz de urls do banco de dados. Mas retornou este
{kind: "ObjectId", path: "user", reason: {}, stringValue: "" "", value: "", proto : Object}
Esta é a função
export const get_single_user_url = async (userId) => {
try {
const response = await axios({
method: "post",
url: "http://192.168.43.62:5000/getUrls",
data: { user: userId },
headers: { Authorization: `Bearer ${localStorage.getItem("token")}` },
});
console.log(response.data);
return response.data;
} catch (error) {
console.log(error.message);
}
};
aqui, userId é passado pelo corpo. Agora, no back-end, quando imprimo o valor de req.body , ele fornece a propriedade do usuário com uma string vazia.
{ do utilizador: "" }
Eu tentei sem usar useEffect, mas depois ele entra em um loop infinito.
Respostas
Como você tem uma matriz de dependência vazia em seu useEffect, ele será acionado apenas uma vez. Parece que userIdé uma string vazia durante a execução.
Você vai querer adicionar alguma lógica em sua hitfunção para fazer a solicitação apenas se ela userIdnão estiver vazia. Além disso, para que seu efeito seja executado quando necessário, você deve adicionar userIdao array de dependência ( [userId]).
Se userIdnão for necessário em nenhum outro lugar além desta função, você pode usar o token em vez disso e analisá-lo userIdem sua hitfunção.
const [urls, setUrls] = useState([]);
const { decodedToken } = useJwt(localStorage.token);
useEffect(() => {
const hit = async (decodedToken) => {
const userId = decodedToken !== null ? decodedToken.userId : "";
if (!userId) {
return;
}
get_single_user_url(userId).then((data) => setUrls(data));
const data = await get_single_user_url(userId);
setUrls(data);
console.log(data);
};
hit(decodedToken);
}, [decodedToken]);