Eslint: no-case-декларация - неожиданное лексическое объявление в блоке case

Как лучше всего обновить состояние в этом контексте внутри редуктора?

case DELETE_INTEREST:
    let deleteInterests = state.user.interests;
    let index = deleteInterests.findIndex(i => i == action.payload);
    deleteInterests.splice(index, 1);
    return { ...state, user: { ...state.user, interests: deleteInterests } };

ESLint не любит операторы let внутри блоков case внутри редуктора, получая:

eslint: no-case-declaration - unexpected lexical declaration in case block

deleteInterests по-прежнему является ссылкой на массив в состоянии, поэтому вы все еще мутируете. Клонируйте список перед склейкой.
Andrew Li 08.06.2018 05:37

Используйте {} для case DELETE_INTEREST в switch, чтобы избавиться от этой проблемы с ворсом согласно eslint.org/docs/rules/no-case-declarations

Himanshu Aggarwal 13.04.2020 09:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
89
2
29 557
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ESLint doesn't like let statements inside case blocks inside a reducer, Why?

Это не рекомендуется, потому что это приводит к тому, что переменная выходит за рамки вашего текущего case. Используя блок, вы ограничиваете область действия переменной этим блоком.

Используйте {} для создания области блока с регистром, например:

case DELETE_INTEREST: {
    let .....
    return (...)
}

Проверьте этот фрагмент:

function withOutBraces() { 
  switch(1){
    case 1: 
      let a=10; 
      console.info('case 1', a); 
    case 2: 
      console.info('case 2', a)
  } 
}

function withBraces() { 
  switch(1){
    case 1: {
      let a=10; 
      console.info('case 1', a); 
    }
    case 2: {
      console.info('case 2', a)
    }
  } 
}

console.info('========First Case ============')
withOutBraces()
console.info('========Second Case ============')
withBraces();

Для удаления элемента из массива используйте array.filter, потому что сращивание внесет изменения в исходный массив. Напишите это так:

case DELETE_INTEREST:
    let deleteInterests = state.user.interests;
    let newData = deleteInterests.filter(i => i !== action.payload);
    return { ...state, user: { ...state.user, interests: newData } };

Но почему? :)

nsandersen 10.09.2019 17:54

Насколько я понял, если вы объявляете переменную внутри блока case, не ограничивая ее с помощью {}, ваша переменная будет доступна в блоке переключателя, но будет назначена только в этом блоке (есть риск, что она не будет объявлена, если она не будет не прохожу через этот случай) eslint.org/docs/rules/no-case-declarations

PaulCo 02.12.2020 10:02

Другие вопросы по теме