【问题标题】:How to display all items from an API in React JS?如何在 React JS 中显示来自 API 的所有项目?
【发布时间】:2021-03-12 18:44:53
【问题描述】:

下面是我的代码,在此我想添加代码以显示所有产品及其来自 API 的图像,我该怎么做?请帮忙?

import React, {useState, useEffect} from 'react'
import "bootstrap/dist/css/bootstrap.min.css"
import Axios from "axios"

function Products() {

const [products, setProducts] = useState({});

const fetchProducts = async () => {
const {data} = await Axios.get('https://api.test.ts/demo/test');  
const products= data
setProducts(products);
};

useEffect(() => {

  fetchProducts()

 }, []);

 return(
     
     <div>
         Want to Display list of products from API
     </div>
 )

}

export default Products;

【问题讨论】:

  • 你能告诉我有什么问题吗?您的问题是您不知道如何获取产品数据并在 Webhook 中使用它?或者你不知道如何在 React 中的 JSX 中显示数据?

标签: javascript html reactjs jsx


【解决方案1】:

我尝试使用您的 URL 来获取产品,但它显示为不可访问,因此我使用待办事项列表的 https://jsonplaceholder.typicode.com API 编写了这个简单的应用程序。

希望这个示例可以帮助您了解如何从获取的数据中获取和显示项目。

import React, { useState, useEffect } from "react";
import "./styles.css";
import Axios from "axios";

function App() {
  const [products, setProducts] = useState([]);

  const fetchProducts = async () => {
    const { data } = await Axios.get(
      "https://jsonplaceholder.typicode.com/todos/"
    );
    const products = data;
    setProducts(products);
    console.log(products);
  };

  useEffect(() => {
    fetchProducts();
  }, []);

  return (
    <div>
      {products.map((product) => (
        <p key={product.id}>{product.title}</p>
      ))}
    </div>
  );
}

export default App;

CodeScandbox Link

这里是另一个例子,返回的数据是对象的形式,而不是上面例子中的数组:

import React, { useState, useEffect } from "react";
import "./styles.css";
import Axios from "axios";

const productsData = {
  note: "",
  notification: "",
  Books: [
    {
      bookID: 65342,
      img: "https://source.unsplash.com/200x300/?book",
      year: 2018,
      bookTitle: "Story Time",
      LibraryInfo: {
        Status: "Out",
        returnDate: "7 Jan"
      }
    },
    {
      bookID: 65332,
      img: "https://source.unsplash.com/200x300/?book",
      year: 2018,
      bookTitle: "Story Time",
      LibraryInfo: {
        Status: "Out",
        returnDate: "7 Jan"
      }
    }
  ]
};
export default function App() {
  const [products, setData] = useState(productsData);
  const [toggle, setToggle] = useState({});
  useEffect(() => {
    setData({});
    Axios.get("https://stylmate1.firebaseio.com/hair.json").then((response) => {
      // console.log(response.data);
      setData(productsData);
    });
  }, [toggle]);
  return (
    <div className="App">
      {/* <button onClick={() => setToggle(!toggle)}>fetch</button> */}
      {products?.["Books"]?.length &&
        products["Books"].map((product) => (
          <div key={Math.random() * 10000}>
            <img src={product.img} width="200" alt="" />
            <p>{product.bookTitle}</p>
            <p>{product.year}</p>
            <p>
              {"Library Status: " +
                product.LibraryInfo.Status +
                "\n" +
                product.LibraryInfo.returnDate}
            </p>
            <p></p>
          </div>
        ))}
    </div>
  );
}


这里是Codesandbox 示例,展示了如何从以对象而不是数组形式返回的 JSON 数据中呈现元素,就像上面的示例一样

【讨论】:

  • 你忘记使用“key”属性了。
  • 显示 :- TypeError: products.map 不是函数。需要从对象中获取,所以 .map 可以在这里工作?
  • 您可以使用Object.entries() 将对象转换为数组,并使用该数组进行映射
  • 如果可能的话,分享 api url 以便我可以看到它返回的数据,然后只有我可以给出确切的答案
  • 或者粘贴Axios获取请求返回的数据
【解决方案2】:
   return (
     <div>
       {products.map((product, index) => (
        <p key={index}>{product.title}</p>
       ))}
     </div>
   );
 

建议有产品id,而不是使用数组索引作为key prop。

   return (
     <div>
       {products.map(({ id, title }) => (
        <p key={id}>{title}</p>
       ))}
     </div>
   );

那个 'key' 属性帮助 React 使用它们唯一的 'key' 属性检测和更改修改过的项目。

【讨论】:

  • 显示 :- TypeError: products.map 不是函数。需要从对象中获取,所以 .map 可以在这里工作?
  • 那是因为你的'products'变量为空,你可以通过console.loging你获取api后收到的数据变量,尝试检查你是否正确获取。
猜你喜欢
  • 2021-05-06
  • 2022-12-09
  • 2023-02-17
  • 2022-12-01
  • 1970-01-01
  • 2021-10-28
  • 2021-08-05
  • 2021-02-18
  • 2022-07-06
相关资源
最近更新 更多