Buscando dados da api in react
Blog.js
import React, { useState, useEffect } from "react"
import Axios from "axios"
const Home = () => {
const [blog, setBlog] = useState([])
useEffect(() => {
loadBlog()
}, [])
const loadBlog = async () => {
await Axios.get(`http://localhost:3001/api/blog/get`)
.then((res) => {
console.log(res.data.data)
setBlog(res.data.data)
console.log(blog)
})
.catch((err) => {
console.log(err)
})
}
return (
<>
<div className="container">
<div className="col-lg-10">
<h2> React CRUD Operation </h2>
</div>
<div className="col-lg-2">
<button> Add Blog </button>
</div>
<table className="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>Picture</th>
<th>Title</th>
<th>Short Description</th>
<th>Author</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td>{blog.id}</td>
<td>
<img src={"../../../public/logo512.png"} alt="not available" />
</td>
<td>{blog.title}</td>
<td>{blog.short_desc}</td>
<td>{blog.author}</td>
<td>
<button>Edit</button> <button>Delete</button>{" "}
</td>
</tr>
</tbody>
</table>
</div>
</>
)
}
export default Home
Estou buscando dados da API e obtendo dados. os dados estão chegando bem, mas não estão indo no setBlog Hook. Quando eu consolo a resposta, tudo bem e os dados são buscados com sucesso, mas o problema é que eles não vão para o gancho setBlog. Sou novo em reagir e não sei por que não vão para o gancho setBlog. qualquer ajuda será apreciada
Respostas
Isso ocorre devido à natureza assíncrona do estado de configuração. O código que você escreveu,
.then((res) => {
console.log(res.data.data)
setBlog(res.data.data)
console.log(blog)
})
aqui, ele é executado de forma síncrona e a atualização do estado real ocorre apenas depois de concluída. se você registrar no console a variável de estado dentro do corpo da função, ela será atualizada na próxima renderização. por exemplo
const Home = () => {
const [blog, setBlog] = useState([])
console.log(blog)
.
.
.
Na primeira vez que seu componente for carregado, o blogvalor será definido como um array vazio (uma vez que é passado como argumento para setState). Em seguida, sua busca de dados será chamada e o valor para blog será definido. Agora, o blogvalor será a matriz que você buscou. Você pode usar isso na renderização.
Você precisará mapear os itens do blog para acessá-lo. Algo como o seguinte.
.
.
.
<tbody>
{blog.map(function (entry) {
return (
<tr>
<td>{entry.id}</td>
<td>
<img src={"../../../public/logo512.png"} alt="not available" />
</td>
<td>{entry.title}</td>
<td>{entry.short_desc}</td>
<td>{entry.author}</td>
<td>
<button>Edit</button> <button>Delete</button>{" "}
</td>
</tr>
);
})}
</tbody>
.
.
.