如何在反应组件状态下修改对象内的数组

2023-12-05

我的应用程序中有以下状态:

    const [activeChats, setActiveChats] = useState([
        {
          id: 1,
          name: 'Luciana Gutierrez',
          role: 'HR Manager',
          avatar: avatar2,
          messages: [
            {
              content: 'Hola Luciana! Tuviste alguna novedad?',
              received: false,
              date: '9:45 AM'
            },
            {
              content: 'Hola John! Todavía no...',
              received: true,
              date: '10:19 AM'
            },
            {
              content: 'Si tengo alguna otra novedad te comento. Gracias!',
              received: true,
              date: '10:20 AM'
            }
          ]
        },
        {
          id: 2,
          name: 'Micaela Alvarez',
          role: 'Marketing Manager',
          avatar: avatar1,
          messages: [
            {
              content: 'Hola John! Entre qué horarios podrías hoy tener la meeting?',
              received: true,
              date: '9:45 AM'
            },
            {
              content: 'Hola Micaela! Muy bien. Yo puedo de 10 a 17 hs.',
              received: false,
              date: '10:05 AM'
            },
            {
              content: 'Dale, agendé la meeting para hoy a las 14hs.',
              received: true,
              date: '10:15 AM'
            }
          ]
        },
        {
          id: 3,
          name: 'Manuel Hoffman',
          role: 'Business Manager',
          avatar: avatar3,
          messages: [
            {
              content: 'Gracias por la reunión de ayer, Manu, fue muy productiva!',
              received: false,
              date: '9:35 AM'
            },
            {
              content: 'Gracias a vos!',
              received: true,
              date: '9:37 AM'
            }
          ]
        }
      ])

我只想通过在每个对象的 messages 键中添加更多项目来修改它,而使状态的其余部分保持原样。

例如,假设我向第一个对象添加两条新消息。状态应该是这样的:

const [activeChats, setActiveChats] = useState([
    {
      id: 1,
      name: 'Luciana Gutierrez',
      role: 'HR Manager',
      avatar: avatar2,
      messages: [
        {
          content: 'Hola Luciana! Tuviste alguna novedad?',
          received: false,
          date: '9:45 AM'
        },
        {
          content: 'Hola John! Todavía no...',
          received: true,
          date: '10:19 AM'
        },
        {
          content: 'Si tengo alguna otra novedad te comento. Gracias!',
          received: true,
          date: '10:20 AM'
        },
        {
          content: 'Example1',
          received: true,
          date: '10:21 AM'
        },
        {
          content: 'Example2',
          received: true,
          date: '10:22 AM'
        }
      ]
    },
    {
      id: 2,
      name: 'Micaela Alvarez',
      role: 'Marketing Manager',
      avatar: avatar1,
      messages: [
        {
          content: 'Hola John! Entre qué horarios podrías hoy tener la meeting?',
          received: true,
          date: '9:45 AM'
        },
        {
          content: 'Hola Micaela! Muy bien. Yo puedo de 10 a 17 hs.',
          received: false,
          date: '10:05 AM'
        },
        {
          content: 'Dale, agendé la meeting para hoy a las 14hs.',
          received: true,
          date: '10:15 AM'
        }
      ]
    },
    {
      id: 3,
      name: 'Manuel Hoffman',
      role: 'Business Manager',
      avatar: avatar3,
      messages: [
        {
          content: 'Gracias por la reunión de ayer, Manu, fue muy productiva!',
          received: false,
          date: '9:35 AM'
        },
        {
          content: 'Gracias a vos!',
          received: true,
          date: '9:37 AM'
        }
      ]
    }
  ])

我怎样才能做到这一点? 我正在考虑扩展运算符,但我不确定如何将它与我的嵌套一起使用。


您需要返回一个新数组setActiveStates特别小心不要改变您正在更新的嵌套对象。长手方法是findIndex()想要更新的项目,然后使用该索引spread slice()相关项目之前和之后的数组的 s,还检索和克隆项目本身以及任何嵌套对象属性以返回副本。

const newMessages = [{ content: 'new1', received: true, date: '10:21 AM' }, { content: 'new2', received: true, date: '10:22 AM' }];
const itemId = 1;

setActiveChats(prevState => {
  const index = prevState.findIndex(({ id }) => id = itemId);
  const item = prevState[index];
  return [
    ...prevState.slice(0, index),
    { ...item, messages: [...item.messages, ...newMessages] },
    ...prevState.slice(index + 1)
  ];
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在反应组件状态下修改对象内的数组 的相关文章

随机推荐

  • R:使用 ggplot2 绘制多个函数

    我需要绘制多个显式函数定义以直观地比较它们 考虑函数族 fun 1 lt function x 1 0 01 x fun 2 lt function x 1 0 1 x fun 3 lt function x 1 0 3 x 这个想法是绘制
  • 动画 GIF 仅在第一帧上是透明的 (Python PIL)

    以下代码从两个图像创建一个 GIF GIFs are always palette images so they would be converted later anyway im1 PIL Image open grin emoji b
  • 从 Spring Integration 的 @Gateway 方法返回 ResponseEntity

    I have IntegrationFlow我在其中调用 HTTP 端点 Bean public IntegrationFlow getInformationFlow RestTemplate restTemplate return Int
  • 使用 requests 和 BeautifulSoup 下载文件

    我正在尝试从以下位置下载一堆 pdf 文件here using requests and 美丽汤4 这是我的代码 import requests from bs4 import BeautifulSoup as bs ANO 2013 ME
  • 如何测量标记分割图像的平均厚度

    我有一张图像 我已经对该图像进行了一些预处理 下面我展示了我的预处理 img cv2 imread my drive image 69 tif 0 median cv2 medianBlur img 13 ret th cv2 thresh
  • 创建在插入时引发异常的触发器

    我的寒假大学任务很少 其中之一就是在桌子上创建触发器 PERSON ID Name Surname Age 触发器应该在用户插入具有无效 ID 的行时通知用户 有效性标准是 ID 长度为 11 位 我尝试写这样的解决方案 CREATE OR
  • 在 JavaScript 中将 ObjectID (Mongodb) 转换为字符串

    我想在 JavaScript 中将 ObjectID Mongodb 转换为字符串 当我从 MongoDB 获取对象时 它就像一个对象一样有 时间戳 秒 公司 机器 我无法转换为字符串 尝试这个 mongo shell objectId s
  • 计算 Spotfire 中特定行的同一列的差异

    我在 Spotfire 中使用计算列进行行差异计算时遇到问题 我想知道是否可以创建一个计算列来计算当前行与具有不同属性的下一行之间的差异 示例表可能是这样的 结果可能是这样的 基本行是 When type 1 则计算其电流之差value及其
  • Google Drive API V3 Javascript - 创建包含内容的文件

    这个问题之前已经被问过 但答案是使用 API V2 谷歌文档没有阐明如何使用 javascript 客户端代码创建包含其内容的文件 我尝试使用 Node 下列出的代码 但是 它只创建文件 不插入任何内容 这是我的代码 let fileMet
  • 子图中的 networkx 正在部分绘制轴框架之外的节点

    当我在子图中绘制 networkx 图时 一些节点在轴的框架中被部分切断 我已经尝试过使用所有不同类型的图表和布局 这始终是一个问题 它总是切断我的节点 就好像 networkx 在比实际更大的轴上绘制图表 这是一个最小的例子 plt su
  • Onpaint 事件(无效)在一段时间正常运行(运行时)后改变执行顺序

    我有 3 个数据图 它们是通过其绘制事件绘制的 当我需要将数据插入到图表中时 我调用控件 invalidate 命令 第一个控件的绘制事件实际上为其他 2 个图形创建了一个位图缓冲区 以避免重复长循环 因此无效命令按特定顺序排列 1 2 3
  • 返回 SQL 中列上所有可能的值组合

    如何返回 2 列中所有值组合的列表 以便它们成为 T SQL 中的新行 e g Col1 Col2 1 2 1 4 1 5 并将其转化为所有组合 1 2 1 4 1 5 2 4 2 5 4 5 假设至少是 SQL 2005CTE with
  • 在表单提交中实现 jQuery 确认模式?

    我正在使用 jQuery 模式确认 如下所示 function dialog confirm dialog resizable false height 190 width 330 modal true buttons Yes functi
  • 使用 MSI 连接 Azure SQL Server - Django

    我已使用以下命令成功连接 Azure SQL ServerAccessToken in the pyodbc 这里我没有使用username or password连接数据库 相反 我用了attrs before通行证token 这里我自动
  • 如何按文件拆分每个提交?

    我知道如何使用手动拆分提交git rebase i 但是如何按文件自动拆分分支中的每个提交 例如 提交A修改了3个文件 f1 f2和f3 拆分后 有 3 个提交 A f1 A f2 和 A f3 我想这样做是为了使主要重写变得更容易 因为我
  • 注入名称中带有点的工厂

    我需要在 Jasmine 中使用 angularjs 模拟注入方法来注入名称中带有点的服务 我尝试添加字符串标识符 但注入方法似乎不支持此操作 这不可能 beforeEach inject rootScope MyApp Factories
  • Android volley 自签名 HTTPS 信任锚未找到证书路径

    我是安卓新手 这个问题已经被问过很多次了 但我已经浏览了这里几乎所有的问题 我试图在 Node Js 服务器上使用自签名证书 使用express 并在 android 上使用 Volley 使用 http blog applegrew co
  • 如何在子活动中获取父活动的名称

    我如何获取子活动中父活动的名称 我有两项活动可以开始同一项活动 为了更好地理解 我有活动一 二 三 从活动一我可以开始活动三 从活动二我可以开始活动三 现在我有一个问题 我如何进入活动三 父活动的名称 因此 当我从活动一开始活动三时 我如何
  • ASP定时器控件正在刷新整个页面?

    我有一个 ASP 计时器控件 应该每三分钟运行一次 尽管我将计时器控件保留在更新面板中 但它每次运行时都会刷新整个页面 有没有只刷新页面的特定部分 而不刷新整个页面 div div
  • 如何在反应组件状态下修改对象内的数组

    我的应用程序中有以下状态 const activeChats setActiveChats useState id 1 name Luciana Gutierrez role HR Manager avatar avatar2 messag