reactjs - 获取无法读取未定义的属性映射,尽管项目状态是用数据设置的
问题描述
所以我正在尝试使用 react 和 express 构建一个购物车。后端工作正常。我正在使用邮递员来测试我的端点,它给了我正确的响应。但是,导致问题的是反应前端。我正在尝试在已设置为服务器响应map
的数组上使用函数,但它给了我一个错误:items
TypeError:无法读取未定义的属性“地图”
这是我的代码:
购物车.js
import React, { Component } from "react";
import axios from "axios";
import CartItem from "./cart1-item.component.js";
import "bootstrap/dist/css/bootstrap.min.css";
import { throws } from "assert";
export default class Cart extends Component {
constructor(props) {
super(props);
this.state = {
items: []
};
}
componentDidMount() {
axios
.get("http://localhost:4000/cart/")
.then(response => {
this.setState({ items: response.data });
})
.catch(function(err) {
console.log(err);
});
}
checkItems() {
return this.state.items.items.map((currItem, i) => {
return <CartItem book={currItem} key={i}></CartItem>;
});
}
Calculate = item => {
return item.qty * item.price;
};
render() {
return (
<div className="container">
<div className="row">{this.checkItems()}</div>
</div>
);
}
}
CartItem.js
import React, { Component } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
const CartItem = props =>
props.items.map(item => {
return <div>{item.title}</div>;
});
export default CartItem;
邮递员对“/购物车”的回应
{
"items": [
{
"item": "5dd7668f33c21d811b74f403",
"title": "Modern PHP",
"price": 25.65,
"qty": 1
}
],
"total": 25.65
}
这也是 server.js 代码我不明白为什么当邮递员给我回复时我的数组是空的,这表明我的端点工作正常。
cartRoutes.route("/").get(function(req, res) {
var cart = req.session.cart;
var displayCart = { items: [], total: 0 };
var total = 0;
for (var item in cart) {
displayCart.items.push(cart[item]);
total += cart[item].qty * cart[item].price;
}
displayCart.total = total;
return res.json(displayCart);
});
cartRoutes.route("/:id").post(function(req, res) {
req.session.cart = req.session.cart || {};
var cart = req.session.cart;
let id = req.params.id;
Book.findById(id, function(err, book) {
if (err) {
console.log(err);
}
if (cart[id]) {
cart[id].qty++;
} else {
cart[id] = {
item: book._id,
title: book.title,
price: book.price,
qty: 1
};
}
res.redirect("/cart");
});
});
我已经花了一天半的时间试图自己解决这个问题。任何帮助将不胜感激。
解决方案
由于另一个答案指出您initialState
在方法中访问时不正确checkItems
,因此您必须保留结构。
我可以建议保持某些结构,在你的情况下看起来这是你的initialState
:
this.state = {
items: []
};
因此,当您调用您的方法时,checkItems
您正在以错误的方式访问它:
checkItems() {
return this.state.items.items.map((currItem, i) => {
return <CartItem book={currItem} key={i}></CartItem>;
});
}
据我所知,当您收到您的回复时,您正在修改您的initialState
结构。
为了解决这个问题,我建议你做这个小改动(只需将 更改response.data
为response.data.items
):
componentDidMount() {
axios
.get("http://localhost:4000/cart/")
.then(response => {
this.setState({ items: response.data.items });
})
.catch(function(err) {
console.log(err);
});
}
以及方法checkItems
:
checkItems() {
return this.state.items.map((currItem, i) => {
return <CartItem book={currItem} key={i}></CartItem>;
});
}
推荐阅读
- css - CSS calc:DIV,任何其他类给出的宽度,减去 px
- go - 如何列出未与组织共享的 Google Drive 文件
- typescript - 在 aws beanstalk 上部署 nextjs/typescript 应用程序(快速服务器)
- jenkins - 如何阻止 Jenkins 重定向到端口 8443?
- assembly - 重写mips代码,使其最快
- python - 将使用 FFmpeg 截取的屏幕截图保存到 Amazon S3 存储桶中
- typescript - 为什么 Typescript 认为 [...T[], T] 和 [T, ...T[]] 不兼容?
- c# - 我可以只更改txt文件中的数字吗?
- javascript - 我试图从我的 d3js 树中删除空的孩子
- javascript - 如何再次调用 react useEffect