当前位置: 首页 > 知识库问答 >
问题:

更新React中具有setState的对象

贺自明
2023-03-14

是否可以使用setstate更新对象的属性?

类似于:

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

我试过:

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

还有这个:

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

第一个会导致语法错误,而第二个则什么也不做。有什么想法吗?

共有2个答案

穆子琪
2023-03-14

这是最快也是最易读的方式:

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

即使this.state.jasper已经包含name属性,也会使用新名称name:'someotherName'with。

董俊晖
2023-03-14

有多种方法可以这样做,因为状态更新是一个异步操作,所以要更新状态对象,我们需要使用带有setstate的updater函数。

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-使用扩展语法:

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
    }
}))

注意:object.assignspread operator只创建浅层副本,因此如果定义了嵌套对象或对象数组,则需要另一种方法。

假设您已将state定义为:

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

更新pizza对象的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
    }
  }
}))

假设您有一个todo应用程序,并且您正在管理以下表单中的数据:

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

若要更新任何todo对象的状态,请在数组上运行映射并检查每个对象的某个唯一值,如果condition=true,则返回具有更新值的新对象,否则返回相同的对象。

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

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

}))

建议:如果对象没有唯一的值,那么使用数组索引

 类似资料:
  • 问题内容: 是否有可能用更新对象的属性? 就像是: 我努力了: 还有这个: 第一个导致语法错误,第二个则什么都不做。有任何想法吗? 问题答案: 有多种方法可以执行此操作,因为状态更新是异步操作,因此要更新状态对象,我们需要使用带有updater函数。 1-最简单的一个: 首先创建的副本,然后执行以下更改: 除了使用,我们还可以这样写: 2-使用 扩展运算符: 注意: 并且仅创建浅表副本,因此,如果

  • 我正在尝试使用DidMount中的localStorage值更新状态,但它没有更新: 在第一个console.log中,我的值为1,在第二个中,它保持为空,不更新状态。

  • 下面是我尝试更新状态值的代码。我不明白为什么我的状态没有更新。我在每一行代码中添加了所有相应的控制台值。

  • 所以我有这个: 只是一个数组的数字例如然而没有给出正确的总数,但?我甚至放了一个超时延迟,看看这是否解决了问题。任何明显的还是我应该发布更多的代码?

  • 我试图在if语句中设置状态,但它不会这样做。结果,我需要从if语句中更新状态,在那个里我可以接收经度和纬度坐标,但它不会保存状态。若我在If语句之外的控制台中回显,我将只读取第一个setState值表单componentWillMount。有什么问题吗?我做错了什么?结构如下:

  • 是否可以使用setState更新对象的属性? 比如: 我可以使用以下方式将事件记录到控制台:- 我在控制台上创建的solidity ABI对象是 我需要设置所需的数据,并在以后使用它,所以我使用.setState如下 但是它显示. setState不是一个函数。请帮帮我。