道具类型验证中的误报
false positive in prop-types validation
这是我的无状态自定义组件
import React from 'react';
import PropTypes from 'prop-types';
import { Link } from 'react-router-dom';
import './../css/bootstrap.min.css';
const RoundLink = (props) => {
const handleClick = (e) => {
if (!props.onClick) {
return;
}
props.onClick(e);
};
const withLink = (button) => {
return (
<Link to={props.url}>
{button}
</Link>
);
};
let button = <button onClick={handleClick} className="esgine-round-button btn btn-default round">{props.children}</button>;
if (props.url) {
return withLink(button);
}
return button;
};
RoundLink.propTypes = {
url: PropTypes.string,
onClick: PropTypes.func,
children: PropTypes.string.isRequired,
};
export default RoundLink;
我的 package.json 有
"prop-types": "^15.6.1",
"react": "^16.2.0",
作为依赖,在 devDependencies
"devDependencies": {
"eslint": "^4.18.2",
"eslint-plugin-react": "^7.7.0"
}
我也在用react-create-app
"react-scripts": "1.1.0",
注意:我知道它已经与 eslint 一起提供,我们必须将它从我们的依赖项中删除并使用开箱即用的那个(我们发现晚了,我们必须回滚我们添加的 eslint)
我们没有在 .eslintrc 中为 prop 类型配置规则(我有其他配置)所以我假设我从默认的 create-react-app 配置中得到错误。
最后,当我 运行 eslint 时,我得到以下错误
error 'url' is missing in props validation react/prop-types
这是一个废话,因为它有明确的定义。
我做错了什么吗?
你没有做错任何事。问题是 returns JSX 组件的每个函数在技术上都是无状态组件。
因此,这也是一个组成部分:
const withLink = (button) => {
return (
<Link to={props.url}>
{button}
</Link>
);
};
它访问props.url
但没有propTypes
。
但是,我认为这是一个错误,因为插件应该意识到 props
在这里没有定义为参数。
解决方法很简单,在函数外访问url
即可:
const { url } = props;
const withLink = (button) => {
return (
<Link to={url}>
{button}
</Link>
);
};
或者,让它成为一个合适的组件:
const WithLink = ({url, button}) => {
return (
<Link to={url}>
{button}
</Link>
);
}
WithLink.propTypes = ...
这是我的无状态自定义组件
import React from 'react';
import PropTypes from 'prop-types';
import { Link } from 'react-router-dom';
import './../css/bootstrap.min.css';
const RoundLink = (props) => {
const handleClick = (e) => {
if (!props.onClick) {
return;
}
props.onClick(e);
};
const withLink = (button) => {
return (
<Link to={props.url}>
{button}
</Link>
);
};
let button = <button onClick={handleClick} className="esgine-round-button btn btn-default round">{props.children}</button>;
if (props.url) {
return withLink(button);
}
return button;
};
RoundLink.propTypes = {
url: PropTypes.string,
onClick: PropTypes.func,
children: PropTypes.string.isRequired,
};
export default RoundLink;
我的 package.json 有
"prop-types": "^15.6.1",
"react": "^16.2.0",
作为依赖,在 devDependencies
"devDependencies": {
"eslint": "^4.18.2",
"eslint-plugin-react": "^7.7.0"
}
我也在用react-create-app
"react-scripts": "1.1.0",
注意:我知道它已经与 eslint 一起提供,我们必须将它从我们的依赖项中删除并使用开箱即用的那个(我们发现晚了,我们必须回滚我们添加的 eslint)
我们没有在 .eslintrc 中为 prop 类型配置规则(我有其他配置)所以我假设我从默认的 create-react-app 配置中得到错误。
最后,当我 运行 eslint 时,我得到以下错误
error 'url' is missing in props validation react/prop-types
这是一个废话,因为它有明确的定义。
我做错了什么吗?
你没有做错任何事。问题是 returns JSX 组件的每个函数在技术上都是无状态组件。
因此,这也是一个组成部分:
const withLink = (button) => {
return (
<Link to={props.url}>
{button}
</Link>
);
};
它访问props.url
但没有propTypes
。
但是,我认为这是一个错误,因为插件应该意识到 props
在这里没有定义为参数。
解决方法很简单,在函数外访问url
即可:
const { url } = props;
const withLink = (button) => {
return (
<Link to={url}>
{button}
</Link>
);
};
或者,让它成为一个合适的组件:
const WithLink = ({url, button}) => {
return (
<Link to={url}>
{button}
</Link>
);
}
WithLink.propTypes = ...