在 React 中使用 setState 更新对象

2024-01-28

是否有可能更新对象的属性setState?

就像是:

this.state = {
   jasper: { name: 'jasper', age: 28 },
}

我努力了:

this.setState({jasper.name: 'someOtherName'});

和这个:

this.setState({jasper: {name: 'someothername'}})

第一个结果导致语法错误,第二个则什么也不做。有任何想法吗?


有多种方法可以做到这一点,因为状态更新是异步操作 https://stackoverflow.com/questions/42593202/why-calling-setstate-method-doesnt-mutate-the-state-immediately/42593250#42593250,所以要更新状态对象,我们需要使用更新功能 https://reactjs.org/docs/react-component.html#setstate with setState.

1-最简单的一个:

首先创建一个副本jasper然后进行以下更改:

this.setState(prevState => {
  let jasper = Object.assign({}, prevState.jasper);  // creating copy of state variable jasper
  jasper.name = 'someothername';                     // update the name property, assign a new value                 
  return { jasper };                                 // return new object jasper object
})

而不是使用Object.assign我们也可以这样写:

let jasper = { ...prevState.jasper };

2- 使用扩展语法 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator:

this.setState(prevState => ({
    jasper: {                   // object that we want to update
        ...prevState.jasper,    // keep all other key-value pairs
        name: 'something'       // update the value of specific key
    }
}))

Note: Object.assign and Spread Operator只创造浅拷贝 https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language,因此如果您定义了嵌套对象或对象数组,则需要不同的方法。


更新嵌套状态对象:

假设您将状态定义为:

this.state = {
  food: {
    sandwich: {
      capsicum: true,
      crackers: true,
      mayonnaise: true
    },
    pizza: {
      jalapeno: true,
      extraCheese: false
    }
  }
}

更新披萨对象的 extraCheese:

this.setState(prevState => ({
  food: {
    ...prevState.food,           // copy all other key-value pairs of food object
    pizza: {                     // specific object of food object
      ...prevState.food.pizza,   // copy all pizza key-value pairs
      extraCheese: true          // update value of specific key
    }
  }
}))

更新对象数组:

假设您有一个待办事项应用程序,并且您正在以这种形式管理数据:

this.state = {
  todoItems: [
    {
      name: 'Learn React Basics',
      status: 'pending'
    }, {
      name: 'Check Codebase',
      status: 'pending'
    }
  ]
}

要更新任何待办事项对象的状态,请在数组上运行映射并检查每个对象的某些唯一值,以防出现以下情况condition=true,返回具有更新值的新对象,否则返回相同的对象。

let key = 2;
this.setState(prevState => ({

  todoItems: prevState.todoItems.map(
    el => el.key === key? { ...el, status: 'done' }: el
  )

}))

建议:如果对象没有唯一值,则使用数组索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 React 中使用 setState 更新对象 的相关文章

随机推荐

  • 如何将 git 存储库设置为只读?

    我有一些通过 SSH 远程访问的 git 存储库 我想将其中一些设置为只读以防止更多推送 有些人有指向这些存储库的遥控器 这些裸存储库已初始化 shared group 那么将所有文件的文件权限设置为 660 是否足以仍然允许 SSH 访问
  • 如何在 python 中转义正斜杠,以便 open() 将我的文件视为要写入的文件名,而不是要读取的文件路径?

    让我先说我是不太确定我的代码发生了什么 我对编程相当陌生 我一直在为我的 python CS 课程创建一个单独的最终项目 该项目每天检查我老师的网站 并确定自上次程序运行以来他是否更改了他网站上的任何网页 我现在正在执行的步骤如下 def
  • 如何解决Sonar错误:无法加载组件类org.sonar.scanner.scan.ProjectLock

    我在 netbeans 项目上运行 Sonar 时遇到一些问题 它不起作用 我有以下错误 C Users remy fischer Desktop NetBeansProjects NetBeansProjects BinPacking s
  • Xcode 项目在文档大纲中显示为灰色

    我一直在使用 iCloud 将我正在处理的 Xcode 项目从笔记本电脑 同步 到桌面 不幸的是 它似乎运作得不太好 我今天在台式机上打开了一个昨天在笔记本电脑上工作的项目 If I open the file on the desktop
  • 使用 jQuery 获取 ListBox 中选定项目的数量

    如主题中所述 当用户选择新项目时 如何使用 jQuery 获取 ListBox 中选定项目的计数 我有这些代码 Html ListBoxFor x gt Model StatesID Model States new class chzn
  • 十进制小时变成时间?

    我在数据库中有一个小时字段 例如 1 4 1 5 1 7 我需要将其转换回 HH MM 做到这一点最简单的方法是什么 TimeSpan FromHours http msdn microsoft com en us library syst
  • HttpSessionListener 不起作用

    我已经实现了 HttpSessionListiner 但它不起作用 用调试器检查 输入 servlet 后创建新会话 登录后 JSESSION ID 发生变化 但 session getCreateTime 保持不变 会话保持不变 使用注释
  • Erlang集群

    我正在尝试使用 Erlang 作为将所有组件粘合在一起的粘合剂来实现一个集群 我喜欢它创建一个完全连接的节点图的想法 但在在线阅读不同的文章后 似乎这不能很好地扩展 最多有 50 100 个节点 OTP 的开发者是否故意施加此限制 我确实知
  • 调用未定义函数curl_file_create() [文件处理]

    我正在尝试使用curl上传文件 在PHP文档中它说 要发布文件 请在文件名前面添加 并使用完整路径 可以通过在文件名后面加上格式为 type mimetype 的类型来显式指定文件类型 此参数可以作为 urlencoded 字符串 如 pa
  • FBSDK 登录错误代码:Objective-C 中的 308

    我不断得到 Error Domain com facebook sdk login Code 308 操作无法 完成 com facebook sdk login 错误 308 尝试从我的设备登录 Facebook 时 我的代码可以在模拟器
  • WebKit 及其遗留前缀

    我正在尝试编译特性前缀为 apple and khtml WebKit 支持哪些and since 哪个版本它们最终被放弃或引入 他们受到什么限制 例如 您可以在以下位置找到它们吗 document body style 我猜只有像记者这样
  • 共同好友数量最多的好友

    我想找到我与他们共同好友数量最多的朋友 我尝试使用 FQL 和图形 API 按以下方式执行此操作 获取当前登录用户的好友列表 FQL SELECT uid1 FROM friend WHERE uid2 MY USER ID and uid
  • Cin 无需等待输入?

    对于我正在开发的项目 我需要程序能够接收用户的输入 但是当他们输入某些内容时 程序可以继续循环 For example while true if userInput true cin gt gt input DO SOMETHING 这意
  • 标记数据和未标记数据有什么区别? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 In this http www youtube com watch v qkcFRr7LqAw在 Sebastian Thrum 的视频
  • 我可以在以后的版本中更改 Android 应用程序图标和名称吗?

    这在某种程度上听起来很愚蠢 但我想知道是否可以在后续版本中更改应用程序徽标 图标 和 Android 名称 比如说 今天我在 Android 市场上推送我的应用程序 明天我想更改徽标 图标 我知道我 不应该 这样做 但是可以这样做吗 另外
  • 使用 OpenVPN 创建 VPN

    我在 Android 10 上连接 VPN 时遇到问题 并在 logcat 中收到以下消息 这是权限错误 寻找解决方案 还在 Mainfest 中添加了 android requestLegacyExternalStorage true 但
  • 在 XSLT 中,在使用时计算设置为 name(..) 之类的变量是否正常?

    我的 XML 中有几棵树 想要根据另一棵树的名称来访问其中一棵树 这里被称为tab name它是当前节点的父标签 所以我使用 name 如果我在设置变量的同一位置进行测试 这会给我正确的值 然而 我遇到的问题是 当我引用 tab name
  • 在单个查询中为每个 DISTINCT 记录选择多条记录

    我需要为每个不同的记录选择几行 几乎就像这里问的那样在 SQL Server 2008 中为每个不同 ID 选择前 n 条记录 https stackoverflow com questions 3364224 select first n
  • 我可以使用同一个套接字进行多个连接吗?

    我正在尝试创建一个扫描一系列地址的 python 函数 我启动了一个套接字并将该套接字作为参数传递给连接到它的函数 def scan socket address port c socket connect ex address port
  • 在 React 中使用 setState 更新对象

    是否有可能更新对象的属性setState 就像是 this state jasper name jasper age 28 我努力了 this setState jasper name someOtherName 和这个 this setS