Получение данных из api в React

Aug 20 2020

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

Я получаю данные из API и получаю данные. данные идут нормально, но не попадают в ловушку setBlog. Когда я консольного ответа, все в порядке, и данные получены успешно, но проблема в том, что он не попадает в ловушку setBlog. Я новичок в реакции и не знаю, почему она не попадает в ловушку setBlog. любая помощь будет приветствоваться

Ответы

1 KennyJohnJacob Aug 20 2020 at 21:49

Это связано с асинхронным характером настройки состояния. Код, который вы написали,

.then((res) => {
        console.log(res.data.data)
        setBlog(res.data.data)
        console.log(blog)
      })

здесь он выполняется синхронно, и фактическое обновление состояния происходит только после его завершения. если вы консоль регистрируете переменную состояния в теле функции, она будет обновлена ​​при следующем рендеринге. например

const Home = () => {
  const [blog, setBlog] = useState([])
  console.log(blog)
  .
  .
  .

В первый раз, когда ваш компонент загружается, blogзначение будет установлено в пустой массив (поскольку он передается в качестве аргумента setState). Затем будет вызвана ваша выборка данных и будет установлено значение для блога. Теперь blogзначением будет массив, который вы выбрали. Вы можете использовать это при рендеринге.

Чтобы получить к нему доступ, вам нужно будет отобразить элементы в блоге. Примерно так.

.
.
.
<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>
.
.
.