【问题标题】:Can I add my React.Component subclass to ESLint rules?我可以将我的 React.Component 子类添加到 ESLint 规则中吗?
【发布时间】:2019-08-30 19:14:11
【问题描述】:

我正在开发一个使用 Webpacker 构建 ES6 React 应用程序的项目。我们使用 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() 也会很有帮助而不是 AsyncComponent 子类中的 render()

来自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。
  • ESLint 没有将它们检测为组件是什么意思?如果有错误,请发布。

标签: javascript reactjs ecmascript-6 eslint


【解决方案1】:

我不确定您要达到的目标。我想你可以试试 return super.render()

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

但是像上面所说的那样扩展组件是个坏主意,对这类东西使用钩子、Hocs 或 renderProps 模式,我知道这可能会令人困惑,特别是如果你来自“OO”背景,但采取你所采取的方法将比它的价值更麻烦。

【讨论】:

    【解决方案2】:

    感谢@fard 的建议。我试图以错误的方式做到这一点......似乎React Higher-Order Components 是做我想要在这里实现的目标的正确方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-28
      • 2021-04-14
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2023-01-14
      • 2019-08-21
      相关资源
      最近更新 更多