我正在尝试从我的CartPage页面上的UploadProductPage检索保存到MongoDB的产品数据。在我的UploadProductPage上,我将通过axios将产品信息发送到MongoDB,以便在按下“提交”按钮后将其存储在DB中。我想知道是否可以在CartPage上请求数据库信息,然后用提交的数据相应地填充购物车。
因此过程如下所示:在UploadProductPage上上传产品详细信息->按提交/发送到mongoDB的数据->重定向到购物车->购物车请求产品详细信息并相应地填充购物车。
代码如下:
UploadProductPage:
import React, { useState } from 'react'
import { Typography, Button, Form, message, Input, Icon } from 'antd';
import FileUpload from '../../utils/FileUpload'
import Axios from 'axios';
const { Title } = Typography;
const { TextArea } = Input;
const Continents = [
{ key: 1, value: "Africa" },
{ key: 2, value: "Europe" },
{ key: 3, value: "Asia" },
{ key: 4, value: "North America" },
{ key: 5, value: "South America" },
{ key: 6, value: "Australia" },
{ key: 7, value: "Antarctica" }
]
function UploadProductPage(props) {
const [TitleValue, setTitleValue] = useState("")
const [DescriptionValue, setDescriptionValue] = useState("")
const [PriceValue, setPriceValue] = useState(0)
const [ContinentValue, setContinentValue] = useState(1)
const [Images, setImages] = useState([])
const onTitleChange = (event) => {
setTitleValue(event.currentTarget.value)
}
const onDescriptionChange = (event) => {
setDescriptionValue(event.currentTarget.value)
}
const onPriceChange = (event) => {
setPriceValue(event.currentTarget.value)
}
const onContinentsSelectChange = (event) => {
setContinentValue(event.currentTarget.value)
}
const updateImages = (newImages) => {
setImages(newImages)
}
const onSubmit = (event) => {
event.preventDefault();
if (!TitleValue || !DescriptionValue || !PriceValue ||
!ContinentValue || !Images) {
return alert('fill all the fields first!')
}
const variables = {
writer: props.user.userData._id,
title: TitleValue,
description: DescriptionValue,
price: PriceValue,
images: Images,
continents: ContinentValue,
}
Axios.post('/api/product/uploadProduct', variables)
.then(response => {
if (response.data.success) {
alert('Product Successfully Uploaded')
props.history.push('/user/cart/')
} else {
alert('Failed to upload Product')
}
})
}
return (
<div style={{ maxWidth: '700px', margin: '2rem auto' }}>
<div style={{ textAlign: 'center', marginBottom: '2rem' }}>
<Title level={2}> Upload Travel Product</Title>
</div>
<Form onSubmit={onSubmit} >
{/* DropZone */}
<FileUpload refreshFunction={updateImages} />
<br />
<br />
<label>Title</label>
<Input
onChange={onTitleChange}
value={TitleValue}
/>
<br />
<br />
<label>Description</label>
<TextArea
onChange={onDescriptionChange}
value={DescriptionValue}
/>
<br />
<br />
<label>Price($)</label>
<Input
onChange={onPriceChange}
value={PriceValue}
type="number"
/>
<br /><br />
<select onChange={onContinentsSelectChange} value={ContinentValue}>
{Continents.map(item => (
<option key={item.key} value={item.key}>{item.value} </option>
))}
</select>
<br />
<br />
<Button
onClick={onSubmit}
>
Submit
</Button>
</Form>
</div>
)
}
export default UploadProductPage
CartPage:
import React, { useEffect, useState } from 'react'
import { useDispatch } from 'react-redux';
import {
getCartItems,
removeCartItem,
onSuccessBuy
} from '../../../_actions/user_actions';
import UserCardBlock from './Sections/UserCardBlock';
import { Result, Empty } from 'antd';
import Axios from 'axios';
import Paypal from '../../utils/Paypal';
function CartPage(props) {
const dispatch = useDispatch();
const [Total, setTotal] = useState(0)
const [ShowTotal, setShowTotal] = useState(false)
const [ShowSuccess, setShowSuccess] = useState(false)
const productId = props.match.params.productId
const [Product, setProduct] = useState([])
useEffect(() => {
let cartItems = [];
if (props.user.userData && props.user.userData.cart) {
if (props.user.userData.cart.length > 0) {
props.user.userData.cart.forEach(item => {
cartItems.push(item.id)
});
dispatch(getCartItems(cartItems, props.user.userData.cart))
.then((response) => {
if (response.payload.length > 0) {
calculateTotal(response.payload)
}
})
}
}
}, [props.user.userData])
const calculateTotal = (cartDetail) => {
let total = 0;
cartDetail.map(item => {
total += parseInt(item.price, 10) * item.quantity
});
setTotal(total)
setShowTotal(true)
}
const removeFromCart = (productId) => {
dispatch(removeCartItem(productId))
.then((response) => {
if (response.payload.cartDetail.length <= 0) {
setShowTotal(false)
} else {
calculateTotal(response.payload.cartDetail)
}
})
}
const transactionSuccess = (data) => {
dispatch(onSuccessBuy({
cartDetail: props.user.cartDetail,
paymentData: data
}))
.then(response => {
if (response.payload.success) {
setShowSuccess(true)
setShowTotal(false)
}
})
}
const transactionError = () => {
console.log('Paypal error')
}
const transactionCanceled = () => {
console.log('Transaction canceled')
}
return (
<div style={{ width: '85%', margin: '3rem auto' }}>
<h1>My Cart</h1>
<div>
<UserCardBlock
products={props.user.cartDetail}
removeItem={removeFromCart}
/>
{ShowTotal ?
<div style={{ marginTop: '3rem' }}>
<h2>Total amount: ${Total} </h2>
</div>
:
ShowSuccess ?
<Result
status="success"
title="Successfully Purchased Items"
/> :
<div style={{
width: '100%', display: 'flex', flexDirection: 'column',
justifyContent: 'center'
}}>
<br />
<Empty description={false} />
<p>No Items In the Cart</p>
</div>
}
</div>
{/* Paypal Button */}
{ShowTotal &&
<Paypal
toPay={Total}
onSuccess={transactionSuccess}
transactionError={transactionError}
transactionCanceled={transactionCanceled}
/>
}
</div>
)
}
export default CartPage
谢谢您的帮助!