【问题标题】:How to update react JS state functional component如何更新 React JS 状态功能组件
【发布时间】:2021-10-07 19:57:49
【问题描述】:

如何更改特定对象的状态,例如,我有这样的数据

const colors= [
      {
        id: 1,
        name: "red",
      },
      {
        id: 1,
        name: "green",
      },
      {
        id: 2,
        name: "blue",
      },
    ];

const storage = [{
id:2,
name:"64 GB"
},
{
id:2,
name:"128 GB"
]

状态值应该是这样[{id:1, name:'red"}, {id:2,name:"128GB"}]

有没有办法仅根据 id 更新状态?例如:我需要循环数据,如果state.id === id 它将更新该特定对象。 所以在我们的例子中,如果state.id === 1,我需要将状态更新为[{id:1, name:'green"}, {id:2,name:"128GB"}]

提前致谢

【问题讨论】:

  • 使用Array.map创建新对象
  • 您想更新颜色或存储空间吗?你的州是哪个州?
  • 两者都处于我的状态,我想根据输入数据更新它们

标签: javascript reactjs react-functional-component


【解决方案1】:

您可以使用浅拷贝更新对象的数组状态并更改值,如下所示:

import * as React from "react";

export default function App() {
  const [colors, setColors] = React.useState([
    {
      id: 1,
      name: "red"
    },
    {
      id: 1,
      name: "green"
    },
    {
      id: 2,
      name: "blue"
    }
  ]);
  const updateState = (id, name) => {
    let copy = [...colors];
    let color = copy.filter((x) => x.id == id)[0];
    if (!color) return;
    let index = copy.indexOf(color);
    color.name = name;
    copy[index] = color;
    setColors(copy);
  };
  return (
    <div className="App">
      {colors.map((color, index) => (
        <>
          <p>
            {color.id} : {color.name}
          </p>
        </>
      ))}
      <button
        onClick={() => {
          updateState(2, "yellow");
        }}
      >
        update
      </button>
    </div>
  );
}

【讨论】:

    【解决方案2】:

    您可以随时复制本地 var 中的当前值,修改并重新设置状态。比如:

    const [colors, setColor] = useState([
      {
        id: 1,
        name: "red",
      },
      {
        id: 1,
        name: "green",
      },
      {
        id: 2,
        name: "blue",
      },
    ]);
    
    ...
    
    let colorCopy = Object.assign({}, colors); //<-- make a copy of color
    colorCopy = colorCopy.map(x => { 
       if (x.id === 1) x.name = "black";
       return x;
    }; // modify name property for id === 1
    setColor(colorCopy); //<-- set new state
    

    编辑

    @Nicolas Menettrier 和 @andy mccullough 提出了一个很好的讨论点:“如果 map 函数已经复制了颜色数组,为什么还要调用 Object.assign?”这是正确的,所以你也可以这样写上面的代码:

    let colorCopy = colors.map(x => { 
       if (x.id === 1) x.name = "black";
       return x;
    }; // modify name property for id === 1
    setColor(colorCopy); //<-- set new state
    

    少了 1 行代码。

    【讨论】:

    • 为什么在数组上使用Object.assign({}, colors)?当.map 无论如何都会创建一个新数组时,为什么要“复制”,为什么当constcolorCopy 时要重新分配它?
    • 为什么不直接做一个color.map 呢?它将返回一个新数组并且不会改变状态
    • @NicolasMenettrier @andy 是的,在这种情况下我认为我们可以直接做let colorCopy = colors.map(...)
    猜你喜欢
    • 2020-08-12
    • 2021-01-12
    • 1970-01-01
    • 2020-04-25
    • 2021-03-19
    • 2021-03-14
    • 2021-12-24
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多