道具验证中反应回纹误差的丢失

我有下一个代码,埃斯林特抛出:

反应/道具类型 onClickOut; 在道具验证中缺少

反应/道具类型的孩子; 在道具验证中缺失

定义了 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": {}
}
}
}

。巴贝尔

{
"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,
}
}
332320 次浏览

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

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

如果你想把它定义成一个对象,你需要在类之外定义它,像这样:

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

如果你从 prop-types没有react中导入道具类型,这样会更好,否则你会在控制台中看到警告(作为 反应16的准备) :

import PropTypes from 'prop-types';

看来问题出在 eslint-plugin-react上。

如果您通过解构类中的任何位置对命名对象进行了注释,那么它就无法正确地检测到 propTypes中提到的道具。

过去有 类似的问题

问题出现在 handleClick 中的流注释中,我删除了这个并且工作正常 谢谢@alik

过去几天我遇到了这个问题。正如 Omri Aharon 在他们上面的回答中所说,为你的道具类型添加类似于下面这样的定义是很重要的:

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

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

import PropTypes from 'prop-types';

如果你得到的衬里错误: someProp is not required, but has no corresponding defaultProps declaration所有你要做的就是添加 .isRequired到你的道具定义的结尾,像这样:

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

或者像下面这样添加默认的道具值:

SomeClass.defaultProps = {
someProp: 1
};

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

const { someProp } = this.props;

问题: 在道具验证、 eslintreact/道具类型中缺少“ id1”

<div id={props.id1} >
...
</div>

下面的解决方案在一个函数组件中起作用:

let { id1 } = props;


<div id={id1} >
...
</div>

希望能帮上忙。

我知道这个答案很荒谬,但是可以考虑禁用这个规则,直到问题解决或者升级了工具:

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

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

"rules": {
"react/prop-types": "off"
}

对我来说,将 埃林特-插件-反应升级到最新版本7.21.5就解决了这个问题

功能性反应组件。定义为对象。我得到这个错误,因为我复制和粘贴的对象从一个不同的稍微不同的名称,并忘记更改名称的原型对象。

FooterIcons.propTypes = {} -> FooterIcon.propTypes

PropType 检查是一件好事,建议不要被设置忽略

您可以通过使用 vscode React PropTypes 自动生成 propTypes 生成扩展:

  1. 选择组件的名称
  2. 按下命令 + 。(Windows 是 Ctrl + 。)在 macOS 中显示 Code Actions 并选择 PropTypeesGenerate,或者按 Shift + command + alt + P (Windows 是 shift + ctrl + alt + P)
  3. 输入 proType 以替换默认类型

我发现 eslint 对我自己正在做的项目过于严格,但是对于这个错误,我通过定义我的接口,然后按照这样的方式实现来修正它:

interface myInterface: {
test: string
}


const MyComponent: React.FC<myInterface> = (props: myInterface) => {

用 -npm i prop-types --save安装螺旋桨型软件包 进口它-

import PropTypes from 'prop-types';

然后指定道具,我这样实现-

Text.propTypes = {
children: PropTypes.node.isRequired,
};


export default function Text({ children }) {
return (
<VStyle className="para">
<p>{children}</p>
</VStyle>
);
}


还可以在 eslintrc.json 或.js 文件中添加这个

"rules": {
"react/prop-types": "off"
}

重复我对一个类似问题的回答: Https://stackoverflow.com/a/69199304/4290193

对于那些使用带有 react/prop-types验证规则的 React.FC<IProps>的人来说,eslint-plugin-react@^7.25.0似乎有 解决了的问题。

所以

const Example: React.FC<IProps> = (props: IProps) => ...

在更新之后,这将在没有警告的情况下工作

const Example: React.FC<IProps> = (props) => ...

取代禁用 prop-types规则,我们可以引入子属性作为组件道具的一部分,例如:

import React, { Component } from 'react';


export default class ErrorBoundary extends Component<{ children: React.ReactNode }> {
constructor(props: { children: React.ReactNode }) {
super(props);


this.state = { error: null, errorInfo: null };
}


componentDidCatch(error: Readonly<unknown>, errorInfo: Readonly<unknown>): void {
this.setState({ error, errorInfo });
}


render(): React.ReactElement | React.ReactNode {
const { children } = this.props;
const { error, errorInfo } = this.state as Readonly<Record<string, { componentStack: string }>>;


if (errorInfo)
return (
<details>
<h3>Oops, error detected.</h3>
<p>{error?.toString()}</p>
<p>{errorInfo?.componentStack}</p>
</details>
);
return children;
}
}

上面一个是得到 eslint错误消失的典型例子 ~ ~

别担心,开心点 ~ ~

在新版本的 React 和 Next.js 上,您可以简单地导入 PropType,如下所示,

import PropTypes from "prop-types";

并在文件底部添加 defaultProps 和 protype,例如,

Post.defaultProps = {
posts: "",
};


Post.propTypes = {
posts: PropTypes.string,
};


export default Post;

它应该可以解决您的埃斯林特警告。

另一种方式是:


文件: App.js

    ...
<Component1 key1="abc" />
...

文件: Component 1.js

1 错误:

    function Component1 ({ key1 }) {
console.log('key1', key1);
}

2 错误:

    function Component1 (props) {
let{ key1 } = props;
console.log('key1', key1);
}

3 工程:

注意: prop代替 props

    function Component1 (prop) {
let{ key1 } = prop;
console.log('key1', key1);
}

看起来,衬垫只检查合适的单词 props,而不是 prop或喜欢。
这是一个解决方案,如果您刚刚开始或快速原型。
对于后期或大型项目,定义原型可能更好。