reactjs "Uncaught TypeError: posts.map is not a function" , How to solve this error?

raogr8fs  于 2022-12-22  发布在  React
关注(0)|答案(3)|浏览(221)

因此,我在react js中从本地drupal示例获取数据。我使用json api模块(以json格式发送数据)传递来自drupal的数据。
下面是我如何获取API并将其Map到前端。

`import React, { useEffect, useState } from "react";
import Slider from "react-slick";

function Homeslidersection() {
const settings = {
dots: false,
arrows: false,
infinite: true,
speed: 500,
autoplay: false,
slidesToShow: 1,
slidesToScroll: 1,
};
const [posts, setPosts] = useState([]);
useEffect(() => {
async function loadPosts() {
const response = await fetch(
"http://localhost/drupalreact/jsonapi/node/banner?include=field_banner_image"
);
if (!response.ok) {
// oups! something went wrong
return;
}
const posts = await response.json();
setPosts(posts);
}
loadPosts();
}, []);
return (
<>



<Slider {...settings}>
{posts.map((post,index) => (





Looking
Flexible Workspace In Your City!

Our global network of workspaces enable you to work wherever
you need to be.


Read More



))}




</>
);
}

export default Homeslidersection;

`

I know the errorUncaught TypeError: posts.map is not a functionis due my data coming from drupal json api is not in array format.
就像看到图像一样,整个数据是{[]}而不是数组[...]格式
我该如何解决这个错误呢?因为我不能从drupal端修改任何东西,所以我该如何在react js中从我的前端代码解决这个错误呢?
谢谢你!!!

c3frrgcw

c3frrgcw1#

数据在data属性中。

setPosts(posts.data);
8ulbf1ek

8ulbf1ek2#

由于从API接收到的数据具有多个属性(jsonapidata),并且您将整个响应存储在您的状态中,因此它会抛出错误。
两种解决方案:

  • 或者只将data数组存储在您所在的州(setPosts(posts.data)
  • 或者,如果你想在某处使用jsonapi对象,你可以改变你的map函数(posts.data.map(...)
k0pti3hp

k0pti3hp3#

一个原因是实际数据在www.example.com中response.data,所以你应该按照上面的答案来设置状态(response.data)。第二个原因是你的帖子是空的,因为setState()是异步的。这意味着jsx中的帖子在帖子被填充数据之前运行。你可以使用两种方法来解决这个问题。1).条件渲染

{ posts.length && posts.map(----)}

2).空值检查(仅在.map前放置?)

posts?.map(--)

相关问题