gpt4 book ai didi

javascript - 当更新新项目时,如何在 REACT JS 中保持先前更改的状态,先前设置为默认值?

转载 作者:行者123 更新时间:2023-11-29 15:58:49 25 4
gpt4 key购买 nike

我有一个react 中的购物车(不使用 Redux),每个项目前面都有数量输入字段。 Qty 默认为 1。 TotalPrice 为每个项目提供信息(unitPrice*1)。现在,如果用户更新 Qty 值,则 TotalPrice 需要更新(unitPrice*Qty)。我的代码正在执行此操作,但问题是当我更新一件商品的数量时,它会更新价格,很好,但是当我更新另一件商品的数量时,之前更新的价格会重置为默认值 (回到单价)。

我找了很多都没有用。大多数人使用 redux 但我不想使用它。因此,如果您看到解决方案,请帮助我,因为我想保持所有更新后的价格。

export default class Cart extends Component
{
constructor(props) {
super(props);

this.state = {
data:[],
customer: '',
redirectToReferrer: false,
cart: [],
cartItems: [],

qty: '',
clicked: '' };
this.onChangeQty = this.onChangeQty.bind(this);
}

componentDidMount() {

const retrieved = localStorage.getItem("cartItem");
const arr = JSON.parse(retrieved);
axios.post('http://localhost/Auth/api/customers/show_cart.php', arr,
{
headers: {'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'}
} )
.then(response => {
this.setState({
cartItems :response.data.records
});
})
.catch(error => {
if (error) {
console.log("Error"); }
});

}


onChangeQty(sid,e)
{
this.setState({
clicked: sid,
qty: e.target.value })

}

render()
{
return (
<div id="profileDiv">

<Col md="12" lg="12" sm="12" xs="12">
<h1> <b> Your Shopping Cart </b> </h1>

<Table>
<thead>
<tr className="text-center">

<th> Item# </th>
<th> Image </th>
<th> ID</th>
<th> Name</th>
<th> Unit Price </th>
<th> Quantity </th>
<th> Total Price </th>

</tr>
</thead>

<tbody>
{this.state.cartItems.map( (item, i) =>

<tr>

<td className="text-center">
<h4 key={i}> {i}</h4>
</td>

<td className="text-center">
<Image src={"data:image/png[jpg];base64," + item.Image}
id="cartImage" alt="abc" />
</td>

<td className="text-center">
<h4>{item.SparePartID}</h4>
</td>

<td className="text-center">
<h4> {item.Name}</h4>
</td>

<td className="text-center">
<h4 >{item.Price} </h4>
</td>

<td className="text-center">
<h4 key={item.SparePartID}>
<input className="text-center"
type="number"
min="1"
onChange={(e) => this.onChangeQty(item.SparePartID, e)}
/>
</h4>
</td>

<td className="text-center">
<h4 key={item.SparePartID}>
{
this.state.clicked == item.SparePartID ?
(item.Price*this.state.qty) : item.Price
}
</h4>
</td>

</tr>

)} </tbody>
</Table>
</Col>
</div> ); }
}

最佳答案

您需要做的是,当您拿到购物车商品时,检查每件商品并为每件商品添加数量。并为所有产品的总和添加状态总和。

constructor(props) {
super(props);

this.state = {
data:[],
customer: '',
redirectToReferrer: false,
cart: [],
cartItems: [],
totalPrice: 0
clicked: '' };
this.onChangeQty = this.onChangeQty.bind(this);
}

componentDidMount() {

const retrieved = localStorage.getItem("cartItem");
const arr = JSON.parse(retrieved);
axios.post('http://localhost/Auth/api/customers/show_cart.php', arr,
{
headers: {'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'}
} )
.then(response => {
let myItems = [];
response.forEach(item => {
myItems.push({id: item.id, name: item.name, qty: 1, price: item.price, total: item.price});
})
this.setState({
cartItems :myItems
});
})
.catch(error => {
if (error) {
console.log("Error"); }
});

}

OnChange 方法应该找到所选产品并更新其数量和总价:

onChangeQty(sid,e)
{
const items = this.state.cartItems;
const item = items.find(item => item.id === sid);
const index = items.indexOf(item);
item.qty = e.target.value;
item.total = item.qty * item.price;
items[index] = index;

let totalPrice = 0;
items.forEach(item => {
totalPrice += item.qty * item.price;
});

this.setState({
cartItems: items,
totalPrice
});

}

在 html 中,您可以将总价显示为

{this.state.totalPrice}

如果你想要每个项目的总和,你可以简单地检查它

this.state.cartItems.forEach(item => {
console.log(item.total);
})

关于javascript - 当更新新项目时,如何在 REACT JS 中保持先前更改的状态,先前设置为默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55607638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com