mongodb 从对象数组中保存一个特定的值,并将它们单独存储到另一个状态中,以获得ReactJS之和

j9per5c4  于 2022-11-22  发布在  Go
关注(0)|答案(3)|浏览(124)

除了 这个 问题 之外 , 我 还 尝试 将 一 个 状态 Map 到 另 一 个 状态 , 以 存储 amountToPay 对象 , 从而 得到 它 的 和 。 问题 是 每次 它 呈现 onChange 函数 时 。 它 都 将 每个 状态 存储 为 对象 , 如 您 所 见 :

的 最 大 值 。
我 只 想 得到 [ 434 ] , 而 不是 ['','4','43','434'] , 这样 我 就 可以 , 缩减 数组 , 得到 和 。
将 数组 对象 存储 到 另 一 个 状态 的 方法 如下

const [amountToPay, setAmountToPay] = useState("")
 console.log("AMOUNT TO PAY", amountToPay)
 useEffect(() => {
   serviceItem.map((item) => (
     setAmountToPay([...amountToPay, item.amountToPay])
   ))
 }, [serviceItem])

 useEffect(() => {
   serviceItem.map((item) => (
     setAmountToPay([...amountToPay, item.amountToPay])
   ))
 }, [serviceItem])

中 的 每 一 个
您 可以 在 这里 查看 整个 代码 CodeSandbox code 。 如 有 任何 帮助 , 我们 将 不胜 感激 : )

dm7nw8vv

dm7nw8vv1#

我建议你做几件事:
1.在serviceItem中添加一些id属性。
1.删除const [amountToPay, setAmountToPay] = useState([]);
1.直接使用来自serviceItem集合值为此,您需要创建onChange处理程序,如下所示

const handleChange = (id) => (nextAmount) => {
    setServiceList(prevValue => {
       return prevValue.map(item => item.id === id ? { ...item, amount: nextAmount } : item) 
    }) 
}

并且支付金额可以很容易的从serviceItem集合中得到,没有效果或者其他状态

const procedurePriceTotal = serviceItem.reduce(
    (acc, item) => (acc = acc + item.amount),
    0
);
6yjfywim

6yjfywim2#

发生这种情况是因为您在onChange方法上设置了serviceItem,并使用传递serviceItem作为deps数组,以使用您在其中设置amountToPay效果因此,每次更改时,它都会追加到数组中
不要在 useEffect 中设置金额,而是创建一个方法并调用remove/add按钮,这样它只会在用户完成键入后调用。您还可以放置一个按钮“保存”或“calculate Amount”并调用handleSetAmountToPAY方法,该方法将更新金额。

import React, { useState, useMemo, useEffect } from "react";

export default function App() {
  //Values
  const [serviceItem, setServiceList] = useState([
    { serviceValue: "", quantityValue: "", amountToPay: "" }
  ]);
  console.log("SERVICE ITEM", serviceItem);

  //Add item function
  const handleItemAdd = () => {
    setServiceList([
      ...serviceItem,
      { serviceValue: "", quantityValue: "", amountToPay: "" }
    ]);
    handleSetAmountToPAY(serviceItem)
  };

  //Remove item function
  const handleItemRemove = (index) => {
    const list = [...serviceItem];
    list.splice(index, 1);
    setServiceList(list);
    handleSetAmountToPAY(list)
  };

  //Get Values
  const handleGetValues = (e, index) => {
    const { name, value } = e.target;
    const list = [...serviceItem];
    list[index][name] = value;
    setServiceList(list);
  };

  //Saving state to another state
  const [amountToPay, setAmountToPay] = useState([]);
  console.log("AMOUNT TO PAY", amountToPay);
  const handleSetAmountToPAY =  (list) => {
    list && list.map((item) =>
      setAmountToPay([...amountToPay, item.amountToPay])
    );
  }

  //Add total amount
  const procedurePriceTotal = amountToPay.reduce(
    (index, value) => (index = index + value),
    0
  );
  console.log("TOTAL PRICE", procedurePriceTotal);

  return (
    <div className="App">
      {serviceItem.map((singleItem, index) => (
        <div class="row form-row">
          <div class="col-12 col-md-6 col-lg-4">
            <div class="form-group">
              <label>
                Service <span class="text-danger">*</span>
              </label>
              <input
                name="serviceValue"
                type="text"
                class="form-control"
                value={singleItem.serviceValue}
                placeholder="Tooth Extraction"
                onChange={(e) => {
                  handleGetValues(e, index);
                }}
              />
            </div>
          </div>
          <div class="col-12 col-md-6 col-lg-3">
            <div class="form-group">
              <label>
                Quantity <span class="text-danger">*</span>
              </label>
              <input
                name="quantityValue"
                type="text"
                class="form-control"
                placeholder="1"
                value={singleItem.quantityValue}
                onChange={(e) => {
                  handleGetValues(e, index);
                }}
              />
            </div>
          </div>
          <div class="col-12 col-md-6 col-lg-3">
            <div class="form-group">
              <label>
                Amount (₱)<span class="text-danger">*</span>
              </label>
              <input
                name="amountToPay"
                type="number"
                class="form-control"
                placeholder="500"
                value={singleItem.amountToPay}
                onChange={(e) => {
                  handleGetValues(e, index);
                }}
              />
            </div>
          </div>
          <div class="col-12 col-md-6 col-lg-2">
            <div class="add-more">
              <br />
              {serviceItem.length !== 1 && (
                <button
                  type="submit"
                  onClick={() => handleItemRemove(index)}
                  className="btn btn-primary rx-pr"
                >
                  <i className="fas fa-plus" /> Remove Item
                </button>
              )}
            </div>
          </div>
        </div>
      ))}

      {/* Add Item */}
      <div className="add-more-item rx-pr">
        <button
          type="submit"
          onClick={handleItemAdd}
          className="btn btn-primary rx-pr"
        >
          <i className="fas fa-plus" /> Add Item
        </button>
      </div>
    </div>
  );
}
kse8i1jr

kse8i1jr3#

我用了错误的方法,我通过MapserviceItem,然后使用reduce来得到和,而不是把它再次放入一个单独的对象数组,然后再Map一次来得到和。

const newNumberArray = serviceItem.map(function(item) {
    return parseInt(item.amountToPay)
  })

 const totalAmountPaid =  newNumberArray.reduce((index,value) =>  index = index + value, 0 )

感谢所有的帮助和建议!

相关问题