props验证中缺少react eslint 错误

IT技术 javascript reactjs eslint flowtype
2021-04-17 11:58:16

我有下一个代码,eslint throw:

react/props类型 onClickOut;props验证中缺少

react/props类型的孩子;props验证中缺少

propTypes 已定义,但 eslint 无法识别。

import React, { Component, PropTypes } from 'react';

class IxClickOut extends Component {
  static propTypes = {
    children: PropTypes.any,
    onClickOut: PropTypes.func,
  };

 componentDidMount() {
    document.getElementById('app')
      .addEventListener('click', this.handleClick);
  }

  componentWillUnmount() {
    document.getElementById('app')
      .removeEventListener('click', this.handleClick);
  }

  handleClick = ({ target }: { target: EventTarget }) => {
    if (!this.containerRef.contains(target)) {
      this.props.onClickOut();
    }
  };

  containerRef: HTMLElement;

  render() {
    const { children, ...rest } = this.props;
    const filteredProps = _.omit(rest, 'onClickOut');

    return (
      <div
        {...filteredProps}
        ref={container => {
          this.containerRef = container;
        }}
      >
        {children}
      </div>
    );
  }
}

export default IxClickOut;

包.json

{
  "name": "verinmueblesmeteor",
  "private": true,
  "scripts": {
    "start": "meteor run",
    "ios": "NODE_ENV=developement meteor run ios"
  },
  "dependencies": {
    "fine-uploader": "^5.10.1",
    "foundation-sites": "^6.2.3",
    "install": "^0.8.1",
    "ix-gm-polygon": "^1.0.11",
    "ix-type-building": "^1.4.4",
    "ix-type-offer": "^1.0.10",
    "ix-utils": "^1.3.7",
    "keymirror": "^0.1.1",
    "meteor-node-stubs": "^0.2.3",
    "moment": "^2.13.0",
    "npm": "^3.10.3",
    "rc-slider": "^3.7.3",
    "react": "^15.1.0",
    "react-addons-pure-render-mixin": "^15.1.0",
    "react-dom": "^15.1.0",
    "react-fileupload": "^2.2.0",
    "react-list": "^0.7.18",
    "react-modal": "^1.4.0",
    "react-redux": "^4.4.5",
    "react-router": "^2.6.0",
    "react-styleable": "^2.2.4",
    "react-textarea-autosize": "^4.0.4",
    "redux": "^3.5.2",
    "redux-form": "^5.3.1",
    "redux-thunk": "^2.1.0",
    "rxjs": "^5.0.0-beta.9",
    "rxjs-es": "^5.0.0-beta.9",
    "socket.io": "^1.4.8"
  },
  "devDependencies": {
    "autoprefixer": "^6.3.6",
    "babel-eslint": "^6.0.4",
    "babel-plugin-transform-decorators-legacy": "^1.3.4",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-react": "^6.5.0",
    "babel-preset-stage-0": "^6.5.0",
    "core-js": "^2.0.0",
    "cssnano": "^3.7.1",
    "eslint": "^2.12.0",
    "eslint-config-airbnb": "^9.0.1",
    "eslint-import-resolver-meteor": "^0.2.3",
    "eslint-plugin-import": "^1.8.1",
    "eslint-plugin-jsx-a11y": "^1.2.2",
    "eslint-plugin-react": "^5.1.1",
    "node-sass": "^3.8.0",
    "postcss-cssnext": "^2.6.0",
    "sasslets-animate": "0.0.4"
  },
  "cssModules": {
    "ignorePaths": [
      "node_modules"
    ],
    "jsClassNamingConvention": {
      "camelCase": true
    },
    "extensions": [
      "scss",
      "sass"
    ],
    "postcssPlugins": {
      "postcss-modules-values": {},
      "postcss-modules-local-by-default": {},
      "postcss-modules-extract-imports": {},
      "postcss-modules-scope": {},
      "autoprefixer": {}
    }
  }
}

.babelrc

{
  "presets": [
    "es2015",
    "react",
    "stage-0"
  ],
  "whitelist": [
      "es7.decorators",
      "es7.classProperties",
      "es7.exportExtensions",
      "es7.comprehensions",
      "es6.modules"
  ],
  "plugins": ["transform-decorators-legacy"]
}

.eslintrc

{
  "parser": "babel-eslint",
  "extends": "airbnb",
  "rules": {
    "no-underscore-dangle": ["error", { "allow": [_id, b_codes_id] }],
  },
  "settings": {
    "import/resolver": "meteor"
  },
  "globals": {
    "_": true,
    "CSSModule": true,
    "Streamy": true,
    "ReactClass": true,
    "SyntheticKeyboardEvent": true,
  }
}
6个回答

propTypes如果您希望在类声明中使用它,则需要将其定义为静态 getter:

static get propTypes() { 
    return { 
        children: PropTypes.any, 
        onClickOut: PropTypes.func 
    }; 
}

如果要将其定义为对象,则需要在类外定义它,如下所示:

IxClickOut.propTypes = {
    children: PropTypes.any,
    onClickOut: PropTypes.func,
};

此外,它的更好,如果你输入从props类型prop-types react,否则你会看到在控制台警告(如准备阵营16):

import PropTypes from 'prop-types';
取决于 Babel 配置,如果您使用静态属性插件,它不需要更好。
2021-05-26 11:58:16
不知道为什么一个失败而另一个有效。我认为无论哪种方式都需要在类上静态定义它,也许我错了。
2021-06-12 11:58:16
谢谢。第一个选项抛出相同的错误,第二个选项解决了问题,但我不明白为什么在这种情况下定义为类属性会抛出错误。注意:我有另一个组件可以很好地定义为类属性
2021-06-21 11:58:16

我知道这个答案很荒谬,但请考虑禁用此规则,直到错误得到解决或您升级了工具:

/* eslint-disable react/prop-types */ // TODO: upgrade to latest eslint tooling

或者在你的 eslintrc 中禁用项目范围:

"rules": {
  "react/prop-types": "off"
}
谢谢这也是我在 eslintrc 规则部分下使用的
2021-05-30 11:58:16
禁用此规则的实际语法是: "react/prop-types": "off"
2021-06-05 11:58:16
IMO,这是一种不好的做法,不应推荐给开发人员。禁用规则可能会让你陷入编写糟糕代码的陷阱。(即在看起来更方便时禁用规则。)
2021-06-12 11:58:16

看来问题出在eslint-plugin-react.

propTypes如果您通过在类中的任何地方解构来注释命名对象它无法正确检测到哪些props被提及

过去类似的问题

我正在使用 babel-eslint 并启用所有阶段注意:我有另一个组件可以很好地定义为类属性
2021-05-29 11:58:16
@cristiancamilocedeñogallego 发布相关配置:package.json.eslintrc很难说它为什么不选择 propTypes
2021-06-07 11:58:16
所以问题出在流注释中 handleClick
2021-06-11 11:58:16
是的 @alik 删除了流注释并且工作正常
2021-06-16 11:58:16

我在过去几天遇到了这个问题。就像 Omri Aharon 在上面的回答中所说的那样,为您的props类型添加类似于以下内容的定义很重要:

SomeClass.propTypes = {
    someProp: PropTypes.number,
    onTap: PropTypes.func,
};

不要忘记在类之外添加 prop 定义。我会把它放在我class的正下方/上方。如果您不确定您的 PropType 的变量类型或后缀是什么(例如:PropTypes.number),请参阅此npm 参考要使用 PropTypes,您必须导入包:

import PropTypes from 'prop-types';

如果您收到 linting 错误:someProp is not required, but has no corresponding defaultProps declaration您所要做的就是添加.isRequired到 prop 定义的末尾,如下所示:

SomeClass.propTypes = {
    someProp: PropTypes.number.isRequired,
    onTap: PropTypes.func.isRequired,
};

或者像这样添加默认的 prop 值:

SomeClass.defaultProps = {
    someProp: 1
};

如果你和我一样,没有经验或不熟悉 reactjs,你也可能会得到这个错误:Must use destructuring props assignment. 要修复此错误,请在使用 props 之前定义它们。例如:

const { someProp } = this.props;

对我来说,将eslint-plugin-react升级到最新版本 7.21.5 解决了这个问题