【问题标题】:Update one element of State React更新 State React 的一个元素
【发布时间】:2021-09-06 01:30:44
【问题描述】:

我有一个问题,有点难以解释。

我使用 Hooks 根据从 API 收到的数据设置状态。 我将它显示在我的前端,没问题。

我想从 ONE 元素更新 ONE 值。

这是我的完整组件:

import { UidContext } from "../components/AppContext"
import { totalIncome, totalFees, balance } from "./balance.utils"
import React, { useContext, useEffect, useState } from "react"
import axios from "axios"

export default function Balance() {
    const uid = useContext(UidContext)
    const [userWalletIncomes, setUserWalletIncomes] = useState('')
    const [userWalletFees, setUserWalletFees] = useState('')
    const [formIncomes, setformIncomes] = useState(false)

    useEffect(() => {
        if (uid !== null) {
            axios.get(`${process.env.REACT_APP_API_URL}api/balance/${uid}`)
                .then((res) => {
                    setUserWalletIncomes(res.data[0].incomes)
                    setUserWalletFees(res.data[0].fees)
                })
        }
    }, [uid])

    return (
        <div className="h-screen">
            <section className="border my-2 w-max md:w-11/12 mx-auto text-center">
                <h1 className="text-3xl my-5">Revenus</h1>

                {formIncomes === false && (
                    Object.entries(userWalletIncomes).map(([key, value]) => {
                        return (
                            <div className="text-left mx-auto flex" key={key}>
                                <p className="w-32 border p-1 capitalize">{key} :</p>
                                <p onClick={(e) => setformIncomes(true)} className="w-32 border p-1 text-green-500">{value}€</p>
                            </div>
                        )
                    })
                )}
                {formIncomes === true && (
                    Object.entries(userWalletIncomes).map(([key, value]) => {
                        return (
                            <div className="text-left mx-auto flex" key={key}>
                                <p className="w-32 border p-1">{key} :</p>
                                <input className="w-32 border p-1 text-green-500"
                                    value={value}
                                    onChange={(e) => setUserWalletIncomes(value)} />
                            </div>
                        )
                    })
                )}
            </section>
        </div>
    )
}

所以,当我点击我的&lt;p&gt; 时,它会转换为输入。那我想修改一下收入的金额,设置成状态。

有关信息,我的收藏 (mongo) 如下所示:

{
    "_id": {
        "$oid": "60c763df3d260204865d2069"
    },
    "incomes": {
        "salaire1": 1130,
        "salaire2": 640,
        "Prime": 90
    },
    "__v": 0,
    "fees": {
        "Box": 35,
    }
}

所以我只需要更新收入类别,以及所选键中的金额。不知道我说清楚了吗……

有什么想法吗?

附加信息:我的 setUserWalletIncomes 在输入中擦除所有状态,并将其替换为输入中的唯一值。

【问题讨论】:

    标签: javascript reactjs react-hooks components state


    【解决方案1】:

    您可以利用对象解构来做到这一点

    setUserWalletIncomes({...userWalletIncomes, incomes: {...userWalletIncomes.incomes, [keySelected]: value}});
    

    有关此事的更多信息,请参阅MDN docs

    编辑:感谢您的 Object.entries 函数,您已经拥有它。完整代码见下文。

    <input className="w-32 border p-1 text-green-500"
                                        value={value}
                                        onChange={(e) => setUserWalletIncomes({...userWalletIncomes, incomes: {...userWalletIncomes.incomes, [key]: e.target.value}})} />
    

    【讨论】:

    • 可能他想通过使用e.target.valueonChange事件中获取新值?
    • 我通过输入value 假设他知道如何检索它,keySelected 也是如此。我给出的是一般方法,而不是可以复制粘贴的精确解决方案。
    • 你好。谢谢 !我只是不知道如何选择当前键?您将哪个命名为“keySelected”?
    • @schogges yes x),我需要onChange来改变值,并在正确的地方设置它的状态
    • 编辑了答案。
    【解决方案2】:

    你只想要一张这样的地图:

    Object.entries(userWalletIncomes).map(([key, value]) => {
        return (
          <div className="text-left mx-auto flex" key={key}>
            <p
              className={`w-32 border p-1 ${
                formIncomes === key ? "capitalize" : ""
              }`}
            >
              {key} :
            </p>
            {formIncomes === key ? (
              <input
                className="w-32 border p-1 text-green-500"
                value={value}
                onChange={(e) =>
                  setUserWalletIncomes({
                    ...userWalletIncomes,
                    [key]: e.target.value,
                  })
                }
              />
            ) : (
              <p
                onClick={(e) => setformIncomes(key)}
                className="w-32 border p-1 text-green-500"
              >
                {value}€
              </p>
            )}
          </div>
        );
      });
    

    【讨论】:

    • 你好。该代码中有错误,我找不到在哪里。错误是:Balance.js:未终止的正则表达式。 (60:14)
    • 你能证明这行有问题吗:第 60 行
    • 第 60 行就在您最后一行的下方。它是结束部分的标签。所以我猜一个是缺少一个括号?
    • 我发现了错误,但是当我单击它时,您的代码使我的部分消失了 x)
    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 2020-08-25
    • 2017-04-28
    • 1970-01-01
    • 2018-12-16
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多