【问题标题】:Update only one parameter when array is in array React数组在数组中时只更新一个参数 React
【发布时间】:2021-10-18 12:21:43
【问题描述】:

我有这样的状态数据:

const IssuesList = () => {
  const [issuesList, setIssuesList] = useState([
    {
      groupId: 0,
      groupData: "19-07-2016",
      groupIssues: [
        {
          id: 0,
          title: "Page changes",
          star: true,
        },
        {
          id: 1,
          title: "Review of last issues",
          star: true,
        },
      ],
    },
    {
      groupId: 1,
      groupData: "18-07-2016",
      groupIssues: [
        {
          id: 2,
          title: "Visual UI Update Review",
          star: false,
        },
        {
          id: 3,
          title: "Sidebar changes",
          star: false,
        },
      ],
    },
    {
      groupId: 2,
      groupData: "15-07-2016",
      groupIssues: [
        {
          id: 4,
          title: "Crash update",
          star: false,
        },
        {
          id: 5,
          title: "Page visual UI Update Review",
          star: true,
        },
        {
          id: 6,
          title: "Sidebar update",
          star: false,
        },
      ],
    },
    {
      groupId: 3,
      groupData: "14-07-2016",
      groupIssues: [
        {
          id: 7,
          title: "Crash issue",
          star: true,
        },
        {
          id: 8,
          title: "Visual update & Crash resolve",
          star: true,
        },
        {
          id: 9,
          title: "Header changes",
          star: false,
        },
      ],
    },
  ]);

  return (
    <div className="issuesList">
      {issuesList.map((group) => (
        <IssueGroup
          key={group.groupId}
          group={group}
          setIssuesList={setIssuesList}
          issuesList={issuesList}
        />
      ))}
    </div>
  );
};

export default IssuesList;

当我单击 StarIcon 组件中的特定图标时,我想更改 groupIssues 中的 star 参数:

const StarIcon = ({ star, index, id, setIssuesList, issuesList, group }) => {
  const issueStar = group.groupIssues[index].star;

  return (
    <svg
      xmlns="http://www.w3.org/2000/svg"
      //xmlns:xlink="http://www.w3.org/1999/xlink"
      preserveAspectRatio="xMidYMid"
      width="17"
      height="16"
      viewBox="0 0 17 16"
      className={star ? "staricon filled" : "staricon unfilled"}
      onClick={() => {
        // setIssuesList() TODO
      }}
    >
      <path
        d="M8.500,0.000 L11.301,5.028 L16.999,6.112 L13.033,10.302 L13.753,16.000 L8.500,13.561 L3.247,16.000 L3.967,10.302 L0.001,6.112 L5.699,5.028 L8.500,0.000"
        fill={star ? "#21233d" : "#fff"}
        stroke={star ? "none" : "#e0e0e0"}
      />
    </svg>
  );
};

export default StarIcon;

在该组数据中执行此操作的最佳方法是什么。我知道扩展运算符在那里会很有帮助,但是当我们有对象数组然后我们需要进入特定对象中的另一个数组时,我不知道如何在这个数据结构中实现它。也许改变数据结构会更好或将其分成两个数组?

Ui view here

【问题讨论】:

    标签: javascript arrays reactjs state


    【解决方案1】:

    你应该使用对象的深拷贝,扩展操作符只创建一个浅拷贝。

    例子:

    const changeStar = (grpId, issueId) => {
     setIssuesList(list => (
       list.map(item => (
         item.groupId === grpId ? 
           {...item, groupIssues: item.groupIssues.map(issue => (
             issue.id === issueId ? {...issue, star: !issue.star} : issue
           ))}
         : item
       )
     ))
    }
    

    解释:

    map 函数创建一个全新的数组。除非您有匹配的groupIds,否则它将按原样返回元素。在 groupIds 中,您将根据 id 更改项目。最后,您深度复制了该对象并设置了一个具有所需结果的全新数组。

    【讨论】:

    • You should use a deep copy of the object, spread operator creates only a shallow copy.Spread 运算符通常为您提供深度复制(ES2015),React 处理它的方式不同?
    • 扩展运算符仅在对象未嵌套时创建深层副本。这是一个很好的blog
    • 嗯,好的。我没有考虑嵌套对象。
    • @SinanYaman 非常感谢!很好的解释,它有效:)
    【解决方案2】:

    我认为您需要这样的东西:当前问题列表状态的副本。从该状态副本更新特定星。设置更新状态。

    这是一个工作沙盒示例:https://codesandbox.io/s/bold-browser-cnfw3?file=/src/App.js

    【讨论】:

    • let updatedIssues = issuesList 此行不会创建浅拷贝。而且由于对象是嵌套的,在这个例子中浅拷贝不会完全切割它
    • 我编辑了我的答案。看看我的沙箱。这是作者提供的数据的一个工作示例
    猜你喜欢
    • 2022-01-18
    • 2018-06-25
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多