【问题标题】:Adding one item of a single product, changing the quantity of all products in ReactJS增加一个单品的一项,改变ReactJS中所有产品的数量
【发布时间】:2018-01-30 16:18:08
【问题描述】:

尝试添加两个按钮,一个用于添加项目(增加数量计数),另一个用于删除项目(减少数量计数)以更新数量参数。当我单击一个产品的添加项目按钮时,所有产品的数量都在更新。如何让这些按钮为每个产品独立工作? 下面是我写的代码:

 import React from 'react';
import ReactDOM from 'react-dom';
import Paper from 'material-ui/Paper';
import products from './Products';
import {
    Table,
    TableBody,
    TableHeader,
    TableHeaderColumn,
    TableRow,
    TableRowColumn, } from 'material-ui/Table';



const style = {
    height: 600,
    width: 900,
    margin: 20,
    textAlign: 'center',
    display: 'inline-block',
  };


export default class Cart extends React.Component{
    constructor(props){
        super(props);
        this.state={ count:1 }
    }


addOne(id) {                              // addOne one item when button clicked
    this.setState(prevState => {
      return {count : prevState.count + 1 }
     });
   }

   removeOne(id) {                              // removeOne one item when button clicked
    this.setState(prevState => {
        if(prevState.count>=1) {
      return { count : prevState.count - 1 }
        }
        else{
            alert('quantity cant be less than zero')
        }
     });
   }

render(){
    return(
        <div> 
            <Paper style={style} zDepth={1} > 
                <div> 
                    <div>
                        <h3> here are the products ! </h3>
                    </div> <hr/>
                    <div>
                                {Products.map(productlist =>(
                                    <Table >
                                        <TableHeader displaySelectAll={false} adjustForCheckbox={false} >
                                            <TableRow>
                                                <TableHeaderColumn></TableHeaderColumn>
                                                <TableHeaderColumn></TableHeaderColumn>
                                                <TableHeaderColumn></TableHeaderColumn>
                                                <TableHeaderColumn></TableHeaderColumn>
                                            </TableRow>
                                        </TableHeader>
                                        <TableBody displayRowCheckbox={false} >
                                            <TableRow key={productlist.id}>
                                                <TableRowColumn>{productlist.name}</TableRowColumn>
                                                <TableRowColumn>{productlist.description}</TableRowColumn>
                                                <TableRowColumn>{productlist.description}</TableRowColumn>
                                                <TableRowColumn>Price per each item:<br/> {productlist.price}</TableRowColumn>
                                                <TableRowColumn>
                                                <input  type='button' onClick={this.addOne.bind(this,productlist.id)} value='add an item'/>
                                                <input  type='button' onClick={this.removeOne.bind(this,productlist.id)} value='remove an item'/>
                                                    <br/> <span> quantity:  {this.state.count}  </span> 
                                                </TableRowColumn>
                                            </TableRow>
                                        </TableBody>
                                    </Table>
                                ))}

                            </div>
                            <div> 
                                <p> Total price: </p>
                    </div>

                 </div>
            </Paper>
        </div>
    );
}
}

下面是示例 Product.js 代码:

    let Products=[
    {
        id:1, name:"Fastrack Women's Watch", 
        description:"Analog Pink Dial Women's Watch - 6150SM04",
        price:2500
    },
    {
        id:2, name:"Fastrack Women's Watch", 
        description:"Analog Pink Dial Women's Watch - 6150SM04",
        price:2100
    },
    {
        id:3, name:"Fastrack Women's Watch", 
        description:"Analog Pink Dial Women's Watch - 6150SM04",
        price:1800
    },

];

export default Products;

【问题讨论】:

  • 你知道那毫无意义,对吧?你的计数是products 的长度,所以如果你把它保持在你的状态,推送到数组或切片,设置状态,渲染会处理它。显示{state.products.length} 以获取号码记录。
  • 你想让我向数组推送什么?你能再清楚一点吗?

标签: reactjs shopping-cart


【解决方案1】:

我建议您重新考虑一下您的程序设计。在我看来,您应该将单个产品移动到它自己的组件中,然后它也会有一个状态。因此,从购物车中删除状态并创建一个组件并将其命名为 Product。此 Product 组件将是 Cart 的子组件。如果您需要从 Product 更新购物车中的某些内容,则可以使用回调。

类似

class Cart extends React.Component {
    render(){
        <..>
            {products.map(product => {
                 // New shiny component with state
                 return <Product {...props} />
             })}
        <..>
    }
}

希望这会有所帮助!

【讨论】:

  • 嗨。按照你说的方式试了一下。它既不会引发任何错误,也不会在网页上显示任何内容。
  • 我忘记了退货声明。尝试像 { return }
  • 我把整个东西包裹在 return() 本身。我将用于显示数据的 onclick 方法和表格移动到另一个组件。我按照您提到的方式在 Cart 组件中渲染了该组件。
  • 是的,这也是需要的。你也必须从渲染函数返回。
  • 成功了!谢谢!虽然我在 return() 中写了所有内容,但为什么我们需要在映射时返回 Product 组件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2021-04-29
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多