如何在 React 状态下更新对象

IT技术 javascript reactjs coffeescript
2021-05-01 02:48:13

users在 JS 对象(不是数组)中有一个索引列表它是 React 状态的一部分。

{
    1: { id: 1, name: "John" }
    2: { id: 2, name: "Jim" }
    3: { id: 3, name: "James" }
}

什么是最佳实践:

  1. 添加一个新用户 { id: 4, name: "Jane" } 以 id (4) 作为键
  2. 删除一个 id 为 2 的用户
  3. 将用户 #2 的名称更改为“Peter”

没有任何不可变的助手。我正在使用 Coffeescript 和 Underscore(所以 _.extend 可以......)。

谢谢。

4个回答

这就是我会做的

  • 添加: var newUsers = _.extend({}, users, { 4: { id: 4, ... } })
  • 删除:var newUsers = _.extend({}, users)然后delete newUsers['2']
  • 改变:var newUsers = _.extend({}, users)然后newUsers['2'].name = 'Peter'

如果您不使用 Flux,则使用 this.setState() 来更新状态对象。

delUser(id) {
    const users = this.state.users;
    delete users[id];
    this.setState(users);
}

addChangeUser(id, name) {
    const users = this.state.users;
    users[id] = {id: id, name: name};
    this.setState(users);
}

然后你可以用这个执行你的测试用例:

addChangeUser(4, 'Jane);
addChangeUser(2, 'Peter');
delUser(2);

除了 _.extend 之外,您还可以使用Map进行存储user

let user = new Map();
user.set(4, { id: 4, name: "Jane" }); //adds with id (4) as key
user.myMap.set(2, { id: 2, name: "Peter" }); // set user #2 to "Peter"
user.delete(3); //deletes user with id 3

setState 还接受一个函数,你可能会发现它更直观

function add( user ) {
  this.setState( users => {
    users[ user.id ] = user
    return users
  }
}

function remove( id ) {
  this.setState( users => {
    delete users[ id ]
    return users
}

这些函数假设您的state对象您的users对象,如果它确实您的对象,state.users那么您必须挑选users出来,setState将始终调用传递给实际state对象的函数。

在这个例子add中也可以用来修改,根据你的实际用例你可能想要创建单独的助手。