簡體   English   中英

將數組值的總和乘以react組件中的輸入值

[英]Add up total of array values multiplied by input value in react component

我有一個從JSON數組中拉出的react組件,其中包括一個允許用戶選擇產品數量的輸入。 我當前的問題是,我需要一種方法將所有產品價格乘以數量並將其總和輸出。 我已經設法為每個組件實現了這一目標,但我確實需要一個運行總量,當數量改變時要更新。 這里的困難在於,數組中的某些值將不包括在內,因為它們可能不會被分類為外圍設備。

剛起步時,我希望有人可以提出解決方案。 任何建議將不勝感激。

我的代碼如下

    import React, { Component } from "react";
    import "./App.css";
    import productdata from "./catalog.json";
    import productSort from "./OrderDetails";

    class App extends Component {
      constructor(props) {
        super(props);

        this.state = {
          BundleVal: "",
          ProductCounter: [],
          TotalCounter: [],
          PeripheralCounter: 0,
          PriceCounter: 0 

        };
      }

      updateBundle = val => {
        this.setState({
          BundleVal: val
        });
      };

      updateQuantity = e => {
        var pCounter = this.state.ProductCounter;
        var el = parseInt(e.target.id.split("_")[1], 10);
        pCounter[el] = parseInt(e.target.value, 10);
        this.setState({ ProductCounter: pCounter });
      };

      render() {
        const BundleProducts = [].concat(productSort).map((item, i) =>
          <div key={item.id}>
            {item.id} <br />
            {item.name} <br />
            {item.description} <br />
            Installation: {item.price.installation} <br />
            Monthly: {item.price.recurring} <br />
            <input
              type="number"
              onChange={this.updateQuantity}
              value={this.state.ProductCounter[item.id] || 0}
              id={"product_" + item.id}
            />
            <br />
            {this.state.ProductCounter[item.id] || 0}<br />

            Installation Total: £{parseFloat(this.state.ProductCounter[item.id] * item.price.installation, 10).toFixed(2)}
            <br />
            Monthly Total: £{parseFloat(this.state.ProductCounter[item.id] * item.price.recurring, 10).toFixed(2)}
            <br />
            <hr />
          </div>
        );



        this.state.PeripheralCounter = this.state.ProductCounter
          .filter(function(qty, pid) {
            pid = String(pid);
            for (var i = 0; i < productSort.length; i++) {
              var p = productSort[i];
              if (p.isPeripheral === true && p.id === pid) {
                return true;
              }
            }
            return false;
          })
          .reduce(function(count, carry) {
            return count + carry;
          }, 0);




        let bname = null;
        let maxperipherals = null;
        if (this.state.BundleVal === "1") {
          bname = productdata.data.bundles[0].name;
          maxperipherals = productdata.data.bundles[0].maximumPeripherals;
        } else if (this.state.BundleVal === "2") {
          bname = productdata.data.bundles[1].name;
          maxperipherals = productdata.data.bundles[1].maximumPeripherals;
        } else if (this.state.BundleVal === "3") {
          bname = productdata.data.bundles[2].name;
          maxperipherals = productdata.data.bundles[2].maximumPeripherals;
        } else if (this.state.BundleVal === "4") {
          bname = productdata.data.bundles[3].name;
          maxperipherals = productdata.data.bundles[3].maximumPeripherals;
        } else {
          bname = null;
        }

        return (
          <div>
            <h2>Order</h2>
            Chosen Bundle: {bname}
            <br />
            Number of Peripherals: {this.state.PeripheralCounter}
            <br />
            Maximum Number of Peripherals: {maxperipherals}
            <br />
            Peripherals Installation Total: {}
            <br />
            <Bundle updateBundle={this.updateBundle} />
            <h3>Products</h3>
            {BundleProducts}

          </div>
        );
      }
    }



    class Bundle extends React.Component {
      constructor(props) {
        super(props);

        this.state = {
          BundleVal: ""
        };
      }

      updatebundle = e => {
        this.props.updateBundle(e.target.value);
        this.setState({ BundleVal: e.target.value });
      };

      render() {
        return (
          <div>
            <h4>Bundle</h4>
            <input
              type="radio"
              value="1"
              onChange={this.updatebundle}
              checked={this.state.BundleVal === "1"}
            />
            {" "}Indoor Camera RAPID
            <input
              type="radio"
              value="2"
              onChange={this.updatebundle}
              checked={this.state.BundleVal === "2"}
            />
            {" "}Alarm Only RAPID
            <input
              type="radio"
              value="3"
              onChange={this.updatebundle}
              checked={this.state.BundleVal === "3"}
            />
            {" "}Outdoor Camera RAPID
            <input
              type="radio"
              value="4"
              onChange={this.updatebundle}
              checked={this.state.BundleVal === "4"}
            />
            {" "}Build Your Own Bundle
          </div>
        );
      }
    }

    class Product extends React.Component {
      constructor(props) {
        super(props);

        this.state = {
          ProductVal: ""
        };
      }

      updateproduct = e => {
        this.props.updateProduct(e.target.value);
        this.setState({ ProductVal: e.target.value });
      };

      render() {
        return (
          <div>
            <h4>Product</h4>
            <br />
            <input type="number" onChange={this.updateproduct} />

          </div>
        );
      }
    }
    export default App;

此代碼還從單獨的組件中提取公式

var productSort = productdata.data.products;

productSort.sort(function(a, b){return a.id - b.id});

我的Json值的示例如下

{
    "timestamp": 1502121471,
    "data": {
        "adverts": [],
        "bundles": [{
            "id": "1",
            "name": "Bundle 1",
            "description": "Bundle 1 Description",
            "maximumPeripherals": 32,
            "available": true,
            "count": 0,  
            "price": {
                "installation": "99.99",
                "recurring": "23.99"
            },
            "image": {
                "file": "bundle-one.png",
            },
            "products": ["1", "2", "3"]
        }, {
            "id": "2",
            "name": "Bundle 2",
            "description": "Bundle 2 Description",
            "maximumPeripherals": 32,
            "available": true,
            "count": 0,  
            "price": {
                "installation": "99.99",
                "recurring": "23.99"
            },
            "image": {
                "file": "bundle-two.png",

            },
            "products": ["1", "2", "2", "2", "2"]
        }],
        "products": [{
            "id": "1",
            "name": "Product 1",
            "description": "Product 1 Description",
            "maximumQuantity": 1,
            "isPeripheral": false,
            "isAvailable": true,
            "price": {
                "upfront": null,
                "installation": "0.00",
                "recurring": "0.00"
            },
            "image": {
                "file": "product-one.png",
            }
        }, {
            "id": "2",
            "name": "Product 2",
            "description": "Product 2 Description",
            "maximumQuantity": null,
            "isPeripheral": true,
            "isAvailable": true,
            "count": 0,  
            "price": {
                "upfront": "60.00",
                "installation": "9.60",
                "recurring": "1.25"
            },
            "image": {
                "file": "product-two.png",
            }
        }, {
            "id": "3",
            "name": "Product Three",
            "description": "Product Three Description",
            "maximumQuantity": null,
            "isPeripheral": true,
            "isAvailable": true,
            "count": 0,  
            "price": {
                "upfront": "132.00",
                "installation": "9.60",
                "recurring": "2.75"
            },
            "image": {
                "file": "product-three.png",
            }
        }]
    }
}

花費了一些時間,但我有一個答案。 本質上,這是一個for循環,它循環訪問BundleProducts創建的數組,並將props中的子項相乘,包括安裝成本和數量輸入(在本例中分別為10和19)。 如果有人有更好的解決方案,請隨時發布。

var myTotal = 0; 
  for(var i = 0, len = BundleProducts.length; i < len; i++) {
    myTotal += BundleProducts[i].props.children[19] * BundleProducts[i].props.children[10];  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM