我开始开发一个网上商店,但我遇到了这个错误。 这是我的代码:
import React, { useEffect } from "react";
import { Link } from "react-router-dom";
import Header from "./../components/Header";
import { PayPalButton } from "react-paypal-button-v2";
import { useDispatch, useSelector } from "react-redux";
import { getOrderDetails } from "../Redux/Actions/OrderAction";
import Message from "../components/LoadingError/Error";
import Loading from "../components/LoadingError/Loading";
import moment from "moment/moment";
const OrderScreen = ({match}) => {
window.scrollTo(0, 0);
const orderId = match.params.id;
const dispatch = useDispatch();
const orderDetails = useSelector((state) => state.orderDetails);
const { order, loading, error } = orderDetails;
if (!loading && order && order.orderItems) {
const addDecimals = (num) => {
return (Math.round(num * 100) / 100).toFixed(2);
};
order.itemsPrice = addDecimals(
order.orderItems.reduce((acc, item) => acc + item.price * item.qty, 0)
);
}
useEffect(() => {
dispatch(getOrderDetails(orderId))
},[dispatch, orderId,order])
return (
<>
<Header />
<div className="container">
{
loading ? (<Loading/>) : error ? (<Message variant="alert-danger">{error}</Message>) :
(
<>
<div className="row order-detail">
<div className="col-lg-4 col-sm-4 mb-lg-4 mb-5 mb-sm-0">
<div className="row">
<div className="col-md-4 center">
<div className="alert-success order-box">
<i className="fas fa-user"></i>
</div>
</div>
<div className="col-md-8 center">
<h5>
<strong>Customer</strong>
</h5>
<p>{order.user.name}</p>
<p>
<a href={`mailto:${order.user.email}`}>{order.user.email}</a>
</p>
</div>
</div>
</div>
{/* 2 */}
<div className="col-lg-4 col-sm-4 mb-lg-4 mb-5 mb-sm-0">
<div className="row">
<div className="col-md-4 center">
<div className="alert-success order-box">
<i className="fas fa-truck-moving"></i>
</div>
</div>
<div className="col-md-8 center">
<h5>
<strong>Order info</strong>
</h5>
<p>Shipping: {order.shippingAddress.country}</p>
<p>Pay method: {order.paymentMethod}</p>
{order.isPaid ? (
<div className="bg-info p-2 col-12">
<p className="text-white text-center text-sm-start">
Paid on {moment(order.paidAt).calendar()}
</p>
</div>
)
:
(
<div className="bg-danger p-2 col-12">
<p className="text-white text-center text-sm-start">
Not Paid
</p>
</div>
)}
</div>
</div>
</div>
{/* 3 */}
<div className="col-lg-4 col-sm-4 mb-lg-4 mb-5 mb-sm-0">
<div className="row">
<div className="col-md-4 center">
<div className="alert-success order-box">
<i className="fas fa-map-marker-alt"></i>
</div>
</div>
<div className="col-md-8 center">
<h5>
<strong>Deliver to</strong>
</h5>
<p>
Address: {order.shippingAddress.city},{" "}
{order.shippingAddress.address},{" "}
{order.shippingAddress.postalCode}
</p>
{order.isDelivered ? (
<div className="bg-info p-2 col-12">
<p className="text-white text-center text-sm-start">
Delivered on {moment(order.deliveredAt).calendar()}
</p>
</div>
)
:
(
<div className="bg-danger p-2 col-12">
<p className="text-white text-center text-sm-start">
Not Delivered
</p>
</div>
)}
</div>
</div>
</div>
</div>
<div className="row order-products justify-content-between">
<div className="col-lg-8">
{
order.orderItems.length === 0 ? (
<Message variant="alert-info mt-5">Your order is empty</Message>
)
:
(
<>
{
order.orderItems.map((item,index) => (
<div className="order-product row" key={index}>
<div className="col-md-3 col-6">
<img src={item.image} alt={item.name} />
</div>
<div className="col-md-5 col-6 d-flex align-items-center">
<Link to={`/products/${item.product}`}>
<h6>{item.name}</h6>
</Link>
</div>
<div className="mt-3 mt-md-0 col-md-2 col-6 d-flex align-items-center flex-column justify-content-center ">
<h4>QUANTITY</h4>
<h6>{item.qty}</h6>
</div>
<div className="mt-3 mt-md-0 col-md-2 col-6 align-items-end d-flex flex-column justify-content-center ">
<h4>SUBTOTAL</h4>
<h6>${item.qty * item.price}</h6>
</div>
</div>
))}
</>
)
}
{/* <Message variant="alert-info mt-5">Your order is empty</Message> */}
</div>
{/* total */}
<div className="col-lg-3 d-flex align-items-end flex-column mt-5 subtotal-order">
<table className="table table-bordered">
<tbody>
<tr>
<td>
<strong>Products</strong>
</td>
<td>${order.itemsPrice}</td>
</tr>
<tr>
<td>
<strong>Shipping</strong>
</td>
<td>${order.shippingPrice}</td>
</tr>
<tr>
<td>
<strong>Tax</strong>
</td>
<td>${order.taxPrice}</td>
</tr>
<tr>
<td>
<strong>Total</strong>
</td>
<td>${order.totalPrice}</td>
</tr>
</tbody>
</table>
<div className="col-12">
<PayPalButton amount={345} />
</div>
</div>
</div>
</>
)
}
</div>
</>
);
};
export default OrderScreen;
我变成了这个错误: “TypeError:无法读取未定义的属性(读取‘orderItems’)” 我正在使用 Redux、axios 和 React 开发这个项目。
这是 OrderAction 的代码
import {
ORDER_CREATE_FAIL,
ORDER_CREATE_REQUEST,
ORDER_CREATE_SUCCESS,
ORDER_DETAILS_FAIL,
ORDER_DETAILS_REQUEST,
ORDER_DETAILS_SUCCESS,
ORDER_LIST_MY_FAIL,
ORDER_LIST_MY_REQUEST,
ORDER_LIST_MY_SUCCESS,
ORDER_PAY_FAIL,
ORDER_PAY_REQUEST,
ORDER_PAY_SUCCESS,
} from "../Constants/OrderConstants";
import axios from "axios";
import { CART_CLEAR_ITEMS } from "../Constants/CartConstants";
import { logout } from "./userActions";
// CREATE ORDER
export const createOrder = (order) => async (dispatch, getState) => {
try {
dispatch({ type: ORDER_CREATE_REQUEST });
const {
userLogin: { userInfo },
} = getState();
const config = {
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${userInfo.token}`,
},
};
const { data } = await axios.post(`/api/orders`, order, config);
dispatch({ type: ORDER_CREATE_SUCCESS, payload: data });
dispatch({ type: CART_CLEAR_ITEMS, payload: data });
localStorage.removeItem("cartItems");
} catch (error) {
const message =
error.response && error.response.data.message
? error.response.data.message
: error.message;
if (message === "Not authorized, token failed") {
dispatch(logout());
}
dispatch({
type: ORDER_CREATE_FAIL,
payload: message,
});
}
};
// ORDER DETAILS
export const getOrderDetails = (id) => async (dispatch, getState) => {
try {
dispatch({ type: ORDER_DETAILS_REQUEST });
const {
userLogin: { userInfo },
} = getState();
const config = {
headers: {
Authorization: `Bearer ${userInfo.token}`,
},
};
const { data } = await axios.get(`/api/orders/${id}`, config);
dispatch({ type: ORDER_DETAILS_SUCCESS, payload: data });
} catch (error) {
const message =
error.response && error.response.data.message
? error.response.data.message
: error.message;
if (message === "Not authorized, token failed") {
dispatch(logout());
}
dispatch({
type: ORDER_DETAILS_FAIL,
payload: message,
});
}
};
// ORDER PAY
export const payOrder =
(orderId, paymentResult) => async (dispatch, getState) => {
try {
dispatch({ type: ORDER_PAY_REQUEST });
const {
userLogin: { userInfo },
} = getState();
const config = {
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${userInfo.token}`,
},
};
const { data } = await axios.put(
`/api/orders/${orderId}/pay`,
paymentResult,
config
);
dispatch({ type: ORDER_PAY_SUCCESS, payload: data });
} catch (error) {
const message =
error.response && error.response.data.message
? error.response.data.message
: error.message;
if (message === "Not authorized, token failed") {
dispatch(logout());
}
dispatch({
type: ORDER_PAY_FAIL,
payload: message,
});
}
};
// USER ORDERS
export const listMyOrders = () => async (dispatch, getState) => {
try {
dispatch({ type: ORDER_LIST_MY_REQUEST });
const {
userLogin: { userInfo },
} = getState();
const config = {
headers: {
Authorization: `Bearer ${userInfo.token}`,
},
};
const { data } = await axios.get(`/api/orders/`, config);
dispatch({ type: ORDER_LIST_MY_SUCCESS, payload: data });
} catch (error) {
const message =
error.response && error.response.data.message
? error.response.data.message
: error.message;
if (message === "Not authorized, token failed") {
dispatch(logout());
}
dispatch({
type: ORDER_LIST_MY_FAIL,
payload: message,
});
}
};
在这个文件中是我对订单所做的操作,我认为问题也可能在这里。
由于
orderItems
未定义,这意味着 order
也是如此。
您可以使用条件语句检查两者是否未定义。
if (!loading && order && order.orderItems) {
const addDecimals = (num) => {
return (Math.round(num * 100) / 100).toFixed(2);
};
order.itemsPrice = addDecimals(
order.orderItems.reduce((acc, item) => acc + item.price * item.qty, 0)
);
}
这将确保在尝试访问之前定义了
order
和 orderItems
。