[英]Error: Objects are not valid as a React child when trying to map a nested array for a table component in React
[英]Objects are not valid as a React child when trying to map
我正在尝试从我的 api 获取数据并将其呈现为列表,但它一直给我标题中提到的错误。
import React, { Component } from "react";
import "./style/list.css";
import { getEvents } from "../services/eventService";
import { thisExpression } from "@babel/types";
class Likes extends Component {
constructor(props) {
super(props);
this.state = {
events: []
};
}
async componentWillMount() {
const { data: events } = await getEvents();
this.setState({ events });
console.log(events);
}
async getUserLikes() {
// Get Likes TODO
return 1;
}
render() {
return (
<div>
<ul class="list-group">
{this.state.events.map(event => (
<li
class="list-group-item d-flex justify-content-between align-items-center"
key={event._id}
>
{event.title}
<span class="badge badge-primary badge-pill">
{this.getUserLikes()}
</span>
</li>
))}
</ul>
</div>
);
}
}
export default Likes;
奇怪的是,当我从渲染中删除 getUserLikes() 函数时,映射似乎有效,但是当我添加它时,它却没有。
问题是getUserLikes
是async
。
当以async
调用函数时,它将返回一个 Promise 对象,该对象不是可渲染的。
如果你想在render
内部调用一些函数,它不能是async
。
即使getUserLikes
不调用异步请求,如果在它前面添加async
,它也会返回一个promise
对象。
您可以在下面的示例中看到这种行为。
async function call1() { return 1; } function call2() { return 1; } // Promise Object console.log(call1()) // Actual returned value console.log(call2())
如果你想获取数据并渲染它,你应该在componentDidMount
获取它,而不是在渲染中。
问题在于处理程序的async
性质。 组件返回的语句必须是纯的。 您不能在jsx
块中声明命令式代码。
通常在这种情况下,您希望声明一个本地状态,该状态最终会填充返回的数据并在此之前充当占位符。
const Component = () =>{
const [data, setData] = useState(null)
useEffect(() =>{
fetch(/*..*/).then(response => setData(response))
},[])
return data ? data.map(/*...*/) : <div> Loading </div>
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.