Могу ли я добавить свой подкласс React.Component в правила ESLint?

Я работаю над проектом, который создает приложение ES6 React с помощью Webpacker. Мы используем ESLint, чтобы поддерживать порядок в наших скриптах с некоторыми перехватчиками перед фиксацией, но есть одна проблема, которую я не смог решить. У нас есть пара подклассов React.Component, которые мы используем, и ESLint не определяет их как Components.

Примеры компонентов:

/* AsyncComponent.jsx */
export default class AsyncComponent extends React.Component {
  // Sub-classes will define _render() instead of render()
  render() {
    if (this.isLoaded()) {
      this._render();
    }
  }

  // "Virtual" functions which must be defined by sub-class
  // isLoaded() {}
  // load() {}
  // _render() {}
}
/* MyComponent.jsx */
export default class MyComponent extends AsyncComponent {
  // This works, but is not parsed as a Component by ESLint

  // Define our "virtual" AsyncComponent functions
  isLoaded() {}
  load() {}
  _render() {}
}

МОЙ ВОПРОС: Я хотел бы знать, можно ли настроить ESLint для обнаружения AsyncComponent подклассов, таких как MyComponent в качестве React.Component подклассов, и применять те же правила, что и к другим Components.

БОНУСНЫЙ ВОПРОС: Это может вызвать проблему с методом _render(), который используется в этом конкретном примере, поэтому было бы также полезно, если бы я мог переопределить правила eslint-react, чтобы ожидать _render() вместо render() в подклассах AsyncComponent.

Соответствующие зависимости от package.json:

"eslint": "^5.11.1",
"eslint-config-airbnb": "^17.1.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-jsx-a11y": "^6.1.2",
"eslint-plugin-react": "^7.12.2",
"eslint-plugin-promise": "^4.0.1",
"eslint-plugin-react-redux": "^3.0.1",
"react": "^16.7.0",
"react-dom": "^16.7.0",
"react-redux": "^6.0.0",
"redux": "^4.0.1",

Соответствующий конфиг от .eslintrc:

"extends": [
  "airbnb",
  "plugin:react-redux/recommended",
  "plugin:promise/recommended"
],
"parser": "babel-eslint",
"parserOptions": {
  "ecmaVersion": 8,
  "ecmaFeatures": {
    "experimentalObjectRestSpread": true,
    "impliedStrict": true,
    "classes": true
  }
},
"env": {
  "browser": true,
  "node": true,
  "jquery": true,
  "jest": true
},
"plugins": [
  "react-redux",
  "promise"
],

Вы не должны расширять один компонент другим - используйте композицию вместо наследования. Ваш подход действительно грязный (и его будет сложно поддерживать) - вместо этого вы должны использовать HoC.

r g 09.04.2019 15:16

Что означает они не обнаруживаются ESLint как компоненты? Если есть ошибка, пожалуйста, напишите.

Estus Flask 09.04.2019 15:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
136
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я не уверен, чего вы пытаетесь достичь. Я думаю, вы могли бы попробовать вернуть super.render()

render() {
    if (this.isLoaded()) {
      super.render()
    }
  }

Но это плохая идея расширять компоненты, подобные этому, как сказано выше, используйте хуки, шаблоны Hocs или renderProps для такого рода вещей, я знаю, что это может сбить с толку, особенно если вы исходите из опыта «OO», но принимая подход, который вы сделал будет больше проблем, чем его ценность.

Спасибо @fard за его предложение. Я пытался сделать это неправильно... кажется, что Реагировать на компоненты высшего порядка - правильный способ сделать то, что я пытаюсь здесь достичь.

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