简体   繁体   English

在 React-Redux 中计算 SubTotal

[英]Calculate SubTotal in React-Redux

I built an eshop and trying to find the right way to display SubTotal on the UI...My code for the "Cart" where I want to place the function calculating SubTotal is the following:我建立了一个 eshop 并试图找到在 UI 上显示 SubTotal 的正确方法......我要放置计算 SubTotal 函数的“购物车”代码如下:

import React, { Component } from "react"
import { Card, CardBody, CardHeader, CardTitle, Row, Col } from "reactstrap"
import PanelHeader from "components/PanelHeader/PanelHeader.js"
import { connect } from "react-redux";
import { removeCart} from "../redux/actions";


class Cart extends Component {
   removeFromCart = (product) => {
    const cartProducts = this.props.cart 
    const updatedCartProducts = cartProducts.filter(item => item.id !== product.id);
  
  }
  
  render () {
    const cartProducts = this.props.cart
    const subtotal = (cartProducts.quantity * cartProducts.price).toFixed(2);
    
    return (
      <>
        <PanelHeader size="sm" />
        <div className="content">
          <Row>
            <Col xs={12}>
              <Card>
                <CardHeader>
                  <CardTitle tag="h4">Products List</CardTitle>
                </CardHeader>
                <CardBody>
                <table class="table table-striped table-hover">
                  <thead>
                    <tr>
                      <th scope="col"><strong>#</strong></th>
                      <th scope="col"><strong>Name</strong></th>
                      <th scope="col"><strong>Code Item</strong></th>
                      <th scope="col"><strong>Quantity</strong></th>
                      <th scope="col"><strong>Price</strong></th>
                      <th scope="col"><strong>Sub Total</strong></th>
                      
                    </tr>
                  </thead>
                    <tbody>
                      {cartProducts.map((cartProduct, index) => (             
                      <tr key={cartProduct.id}>
                    <th scope="row">{index +1}</th>
                    <td>{cartProduct.title}</td>
                    <td>{cartProduct.code}</td>
                    <td>{cartProduct.quantity}</td>
                    <td>{cartProduct.price}</td>
                    <td>{subtotal}</td>
                    <td><button onClick ={() => this.props.removeCart(cartProduct)} className="btn btn-danger cart-button px-4">Remove</button></td>
                      </tr>))}
                    </tbody>
                </table>
              </CardBody>
            </Card>
          </Col>
        </Row>
      </div>
    </>
    )
  }
}


const mapStateToProps = (state)=> {
  return {
      cart: state.cart
       }
  }

const mapDispatchToProps = (dispatch) => { 
      return {
        removeCart: (product) => {dispatch(removeCart(product))}
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(Cart);

and my redux file where the addToCart and removeFromCart is the following:和我的 redux 文件,其中 addToCart 和 removeFromCart 如下:

import { ADD_TO_CART } from './constants'
import { REMOVE_FROM_CART } from './constants'
// import { ADD_QUANTITY} from './constants'
// import { SUB_QUANTITY}  from './constants'
// import { EMPTY_CART}  from './constants'


const initialState = {
    cart: [],
  }
const ShoppinReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD_TO_CART:

      let newCart = [...state.cart]
      let itemIndex = state.cart.findIndex(obj => obj.id === action.payload.id)
      let currItem = state.cart[itemIndex]

    if (currItem) {
      currItem.quantity = parseInt(currItem.quantity) + 1
      state.cart[itemIndex] = currItem
      newCart = [...state.cart]

      }

    else {

      newCart = newCart.concat(action.payload)
      }

    return {
      cart: newCart
      }

    case REMOVE_FROM_CART:
      const cart = [...state.cart]
      const updatedCart = cart.filter(item => item.id !== action.payload.id)

    return {
      ...state,
      cart: updatedCart
      }
    
    default:
    return state
  }
}
  export default ShoppinReducer

I know that is better not using redux in order to achieve SubTotal however I posted it for any suggestions!我知道最好不要使用 redux 来实现 SubTotal 但是我发布了它以获取任何建议! Bare in mind that code:请记住该代码:

const subtotal = (cartProducts.quantity * cartProducts.price).toFixed(2);

is not working so I am trying to find another method!不工作所以我想找到另一种方法! Thanks for any help!谢谢你的帮助!

I found what's was wrong and I update my question with an answer for future reference:我发现出了什么问题,并用答案更新了我的问题以供将来参考:

The syntax was very simple:语法非常简单:

<td>{cartProduct.price * cartProduct.quantity}</td>

However, with this code received NaN on my UI.但是,使用此代码在我的 UI 上收到 NaN。 So, I had to change my array of objects.所以,我不得不改变我的对象数组。 I had a $ sign in front of CartProduct price so returned me every time I clicked addToCart the NaN.我在 CartProduct 价格前面有一个 $ 符号,所以每次我点击 addToCart NaN 时都会返回给我。 By removing from CartProducts the $ sign the code I posted above worked just fine!通过从 CartProducts 中删除 $ 符号,我上面发布的代码工作正常!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM