Подтвердить что ты не робот

Как обновить объект в состоянии React

У меня есть индексированный список users в объекте JS (а не в массиве). Это часть состояния React.

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

Какая наилучшая практика:

  • добавить нового пользователя {id: 4, name: "Jane" } с id (4) в качестве ключа
  • удалить пользователя с идентификатором 2
  • измените имя пользователя № 2 на "Питер"

Без каких-либо непреложных помощников. Я использую Coffeescript и Underscore (так что _.extend в порядке...).

Спасибо.

4b9b3361

Ответ 1

Это то, что я сделал бы

  • добавить: var newUsers = _.extend({}, users, { 4: { id: 4, ... } })
  • удалить: var newUsers = _.extend({}, users) затем delete newUsers['2']
  • change: var newUsers = _.extend({}, users) затем newUsers['2'].name = 'Peter'

Ответ 2

Если вы не используете 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);

Ответ 3

Помимо _.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

Ответ 4

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 также может использоваться для изменения, в зависимости от вашего фактического использования, вы можете создать отдельные помощники.

Ответ 5

Использование спредов:

Добавление

this.setState({
  ...this.state,
  4: { id: 4, name: "Jane" },
}

Удаление id 2

let prevState = this.state;
let {"2": id, ...nextState} = prevState;
this.setState({
  ...nextState,
}

Изменение ID 2

this.setState({
  ...this.state,
  2: {
    ...this.state["2"],
    name: "Peter",
  }
}