Как экспортировать данные из функции карты в реакции? - PullRequest
0 голосов
/ 29 октября 2018

Я новичок, чтобы отреагировать, и я пытаюсь написать корзину для покупок, мне нужно использовать данные товаров, выбранных пользователем из магазина, чтобы отправить их на сервер. Это мой код:

import React,{Component} from 'react'
import Grid from '@material-ui/core/Grid';
import Paper from '@material-ui/core/Paper';
import Button from '@material-ui/core/Button';


class Food extends Component{


    constructor(props){
     super(props);
     this.state = {
        items:[],
    cart:[]
      };
    this.addToCart=this.addToCart.bind(this);

    }
componentWillReceiveProps(){
    if (this.props.product.length > 0){
        var info = this.props.product;
        this.setState({items: info});
    }
 }

   addToCart(item){
        var found = false;
        var updatedCart = this.state.cart.map((cartItem)=>{

            if(cartItem.Name === item.Name){
                found = true;
                cartItem.quantity++;
                return cartItem;
            } else{
                return cartItem;

            }
            });
            if (!found) {
                updatedCart.push({Id: item.ProductID, Name: item.Name, Price: item.Price, quantity: 1}) 
               }
               this.setState({
                cart: updatedCart
              });
        }



    render(){




           var products = this.state.items.map((item) => {

            return <Product details={item} addToCart={this.addToCart} key={item.ProductID} />
          })

            return (

                <div>
                  <nav>
                  <div><h3>{this.props.cat}</h3></div>
                    <Cart cart={this.state.cart}/>
                  </nav>
                    <div className="Products">  
                    {products}
                    </div>
                </div>
              );

    }
}



class Cart extends Component{
    constructor(props){
     super(props);
     this.state = {
    open : false,
    total:0,
    quantity: 0
      };
      this.openCart = this.openCart.bind(this);
      this.postOrder = this.postOrder.bind(this);
    }

    openCart(){
        this.setState({open : !this.state.open});
    }

 postOrder(){
     alert('hello')
 }

    render(){
        return(
            <div>
 <div className={"Cart " + (this.state.open ? "Cart-Open" : "")} onClick={this.openCart}>
        <p className="Title">Cart</p>
        <div>
        {this.props.cart.length > 0 ? this.props.cart.map((item) => {

            var itemSelected = [{'id': item.Id, 'quantity':item.quantity}]

            console.log("result",itemSelected);
            console.log("total",item.quantity*item.Price);

          return <p key={item.Id}>{item.Name}{item.quantity > 1 ? <span> {item.quantity}</span> : ''}</p> }) : <p>Empty</p>}
        </div>
        total : {this.state.total}

      </div>
      <Button variant="contained" color="primary" onClick={this.postOrder}>
       خرید  
      </Button>
            </div>
        )
    }

}

class Product extends Component{
constructor(props){
 super(props);
 this.state = {

  };
  this.addToCart = this.addToCart.bind(this);
}

addToCart(){
this.props.addToCart (this.props.details);
}
render(){

    let item = this.props.details;

    return(
         <div className="Product" onClick={this.addToCart}>
        <Grid container spacing={24}> 
<Grid item xs={6} key={item.ProductID}>
<Paper className="food-item">
        <p>{item.Name}</p>
        <p>{item.Excerpt}</p>
        <p>{item.Price}</p>
        </Paper> 
</Grid> 
</Grid> 
      </div>

    )
}

}

export default Food;

как вы видите в компоненте корзины, я получаю данные, которые выбрал пользователь, и сохраняю их в переменную itemSelected, теперь я хочу установить setState, но я не знаю, как я могу экспортировать данные из области функции карты, также я могу setState это внутри метода рендеринга (потому что это вызывает бесконечный цикл). как я могу установить мои данные?

спасибо заранее: -)

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

getCartData() {
    const cartData = this.state.cart.map(function (cartItem) {
      return {
        'id': cartItem.id,
        'name': cartItem.name
      };
    })
    console.log('cartData',cartData)
    this.setState({ cart: cartData })
  }
0 голосов
/ 29 октября 2018

Внутри вашего postOrder () вам нужно перебирать элементы корзины, как показано в примере кода ниже. И вам не нужно держать данные в состоянии.

postOrder() {
 const itemsSelected = this.props.cart.map((item) => {
    return {
       'id': item.Id,
       'quantity':item.quantity 
    };
 }
 console.log(itemsSelected);
 // now, you can post your selected cart items to server here...
 alert('hello')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...