【问题标题】:Add up total of array values multiplied by input value in react component将数组值的总和乘以反应组件中的输入值相加
【发布时间】:2018-02-20 14:57:15
【问题描述】:

我有一个从 JSON 数组中提取的反应组件,其中包括一个允许用户选择产品数量的输入。我目前的问题是我需要一种方法将所有产品价格乘以它们的数量并将它们输出到一个总数中。我已经设法为每个组件实现了这一点,但我真的需要一个在数量改变时更新的运行总数。这里的困难在于数组中的某些值不会被包含在内,因为它们可能不会被归类为外围设备。

对反应还很陌生,我希望有人可以提出解决方案。任何建议将不胜感激。

我的代码如下

    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",
            }
        }]
    }
}

【问题讨论】:

    标签: javascript arrays json reactjs cumulative-sum


    【解决方案1】:

    我花了一些时间思考,但我有一个答案。本质上,它是一个 for 循环,它遍历由 BundleProducts 创建的数组,并将包含安装成本和数量输入(在本例中分别为 10 和 19)的 props 内的子代相乘。如果有人有更好的解决方案,请随时发布。

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

    【讨论】:

      猜你喜欢
      • 2019-10-06
      • 2023-02-08
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多