@mamaanarhiya

Зачем в React так записывают в state?

Для чего нужна такая запись?
this.setState({
      ...this.state,
      some_data: {
        ...this.state.some_data,
        ...input,
      },
    });

Чем она отличается от такой?
this.setState({
      some_data: {
        ...input,
      },
    });


да и зачем нужны эти многоточия?
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 2
  • rockon404
    @rockon404
    Frontend Developer
    Во-первых в setState в корень предыдущее состояние передавать не нужно, так под капотом к нему так и так подмешается предыдущее состояние, в не зависимости от того, что вы туда передадите. Примерно так:
    state = { ...prevState, ...newState };

    Во-вторых не правильно передавать в setState this.state, так как setState выполняется асинхронно и ваше текущее состояние может успеть измениться. Если надо обновить состояние на основе предыдущего, в setState по-хорошему надо передавать функцию, в которую первым аргументом при вызове придет ваше состояние:
    this.setState(prevState => ({
      some_data: {
        ...prevState.some_data,
        ...input,
      },
    });
    Ответ написан
  • dasha_programmist
    @dasha_programmist
    full-stack developer (javascript/c#/golang/mssql)
    создается shallow-copy объекта, то есть оператором "..." (spread operator) копируются свойства объекта, это сделано для того чтобы не терять данные при обновлении одного свойства
    допустим у тебя был объект состояния такой структуры
    let state = {
      x:1,
      y:2,
      z:3
    }

    ты хочешь изменить поле y, для этого тебе нужно скопировать все поля и переназначить y
    state = { ...state, y:25};
    другой вопрос зачем копировать, если можно мутировать (MobX), это фишка называется иммутабельность (Redux), чтобы понять изменилось ли состояние быстрее проверить изменилась ли ссылка на объект, чем делать полный diff, в angular next такая штука в детекторе включается через ChangeDetectionStrategy.OnPush
    Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Busfor Москва
от 130 000 до 180 000 руб.
LPTREND Санкт-Петербург
До 150 000 руб.
15 июля 2018, в 15:03
18000 руб./за проект
15 июля 2018, в 14:20
5000 руб./за проект