Переключить логическое свойство внутри объекта в массиве объектов в состоянии - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть массив объектов в состоянии, например:

this.state = {
  week: [
    {
      en: 'Mon',
      morn: false,
      night: false,
    },
//... the rest of the days...

Я могу успешно переключать логические значения morn и night, например:

this.setState(prevState => {
      prevState.week.map(day => {
        if (target.includes(day.en)) {
          if (target.includes('morn')) {
            day.morn = !day.morn;
          //^ right here
          }
          if (target.includes('night')) {
            day.night = !day.night;
          //^ and here
          }
        }
        return day;
      });
    });

Эслинт жалуется: Assignment to property of function parameter 'day'.

1 Ответ

1 голос
/ 02 апреля 2019

Вы получаете это, потому что у вашего линтера есть следующее правило: https://eslint.org/docs/rules/no-param-reassign

Назначение переменных, объявленных как параметры функции, может вводить в заблуждение и приводить к путанице, так как изменение параметров функции также приведет к изменению объекта аргументов. Часто назначение параметров функции является непреднамеренным и указывает на ошибку или ошибку программиста.

Это правило также может быть настроено на сбой при изменении параметров функции. Побочные эффекты на параметры могут вызвать нелогичный ход выполнения и затруднить поиск ошибок.


Решив это, вы можете создать копию вашего day объекта, который вы можете изменить и вернуть вместо этого:

this.setState(prevState => {
  prevState.week.map(day => {
    const tempDay = {...day};
    if (target.includes(day.en)) {
      if (target.includes('morn')) {
        tempDay.morn = !day.morn;
      }
      if (target.includes('night')) {
        tempDay.night = !day.night;
      }
    }
    return tempDay;
  });
});
...