【发布时间】:2020-12-25 14:05:57
【问题描述】:
下面我有一个父反应组件,其中包括一个子组件,我将通过迭代响应数据来填充子组件的数量。
在我尝试映射时的渲染中,它显示 map 不是函数。
export default class Products extends Component {
state = {
allComics: []
};
render() {
return (
<section className=" py-4 py-lg-6">
<div className="site-content" id="content">
<div className="container">
<div className="row">
<div id="primary" className="content-area order-2">
<div className="shop-control-bar d-lg-flex justify-content-between ">
<h5>Showing 1–12 of 126 results</h5>
<ul
class="nav justify-content-md-center nav-gray-700 mb-5 flex-nowrap flex-lg-wrap overflow-auto overflow-lg-visible"
role="tablist"
>
<li class="nav-item mx-2 mb-1 flex-shrink-0 flex-lg-shrink-1">
<div style={{ minWidth: 280 }}>
<Select options={category} defaultValue={category[0]} />
</div>
</li>
<li class="nav-item mx-2 mb-1 flex-shrink-0 flex-lg-shrink-1">
<div style={{ minWidth: 280 }}>
<Select options={universe} defaultValue={universe[0]} />
</div>
</li>
</ul>
</div>
<div className="tab-content" id="pills-tabContent">
<div
className="tab-pane fade show active"
id="pills-one-example1"
role="tabpanel"
aria-labelledby="pills-one-example1-tab"
>
<ul className="products list-unstyled row no-gutters row-cols-2 row-cols-lg-3 row-cols-xl-5 border-top border-left mb-6">
{
this.state.allComics.map((comic) => (
<div key={comic.id}>
<AllProductsProduct
key={comic.id}
data={comic}
onNavigate={() => this.navigateToComic(comic.id)}
/>
</div>
))}
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
);
}
async componentDidMount() {
let {comicData} = await axios.get("http://localhost:5000/allcomics");
console.log(comicData);
let state = "";
if (comicData) {
state = comicData.map((comic) => {
return {
id: comic._id,
seriesname: comic.seriesname,
issuenumber: comic.issuenumber,
description: comic.name,
imageref: comic.imageref,
};
});
}
console.log(state);
console.log(this.state.allComics);
this.setState({ allComics: state });
}
async navigateToComic(comicId) {}
}
我在这里得到的响应是这样的
[
{
"_id": "5f5468fbc0c3f82c586b14d8",
"seriesname": "Dr Doom",
"issuenumber": 1,
"description": "THE CRACK OF DOOM!",
"imageref": "https://res.cloudinary.com/sdjsandssadsadsa/dsadsa",
"publishdate": "2020-09-06T04:43:39.566Z"
},
{
"_id": "5f5497151cc5391a9ce88420",
"seriesname": "Dr Doom",
"issuenumber": 2,
"description": "THE CRACK OF DOOM!",
"imageref": "https://res.cloudinary.com/sdjsandssadsadsa/dsadsa",
"publishdate": "2020-09-06T08:00:21.384Z"
},
{
"_id": "5f54972d1cc5391a9ce88421",
"seriesname": "Dr Doom",
"issuenumber": 3,
"description": "THE CRACK OF DOOM!",
"imageref": "https://res.cloudinary.com/sdjsandssadsadsa/dsadsa",
"publishdate": "2020-09-06T08:00:45.452Z"
}
]
【问题讨论】:
-
comicData是字符串吗?如果是这样,则需要先将其解析为数组 -
就在你之前
return在你的渲染函数中,当你console.log("-->",this.state.allComics);时你会得到什么 -
尝试使用
componentDidMount中的数组初始化state:let state = []; -
调试您的代码,检查
comicData的确切值。我不太确定为什么您的代码中有解构:let {comicData} = await axios.get(),通常所有数据都在响应的data属性中传递。也许你的意思是let { data: comicData } = await axios.get(...)? -
我将它映射到它的 response.data 并且我启动了组件内部的状态确实像 Ericgio 所说的那样挂载
标签: javascript reactjs axios