[javascript] 소품 유효성 검사에서 누락 된 React eslint 오류
다음 코드가 있습니다. eslint throw :
반응 / 소품 유형 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;
package.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,
}
}
답변
propTypes
클래스 선언 내부에 원하는 경우 정적 getter 로 정의해야합니다 .
static get propTypes() {
return {
children: PropTypes.any,
onClickOut: PropTypes.func
};
}
객체로 정의하려면 다음과 같이 클래스 외부에서 정의해야합니다.
IxClickOut.propTypes = {
children: PropTypes.any,
onClickOut: PropTypes.func,
};
또한 prop-types
, not 에서 prop 유형을 가져 오는 것이 더 좋습니다 react
. 그렇지 않으면 콘솔에 경고가 표시됩니다 ( React 16 준비로 ).
import PropTypes from 'prop-types';
답변
문제가있는 것 같습니다 eslint-plugin-react
.
propTypes
클래스의 어느 곳에서나 디스트 럭처링을 통해 명명 된 객체에 주석을 달면 어떤 props에 언급되었는지 정확하게 감지 할 수 없습니다 .
과거에도 비슷한 문제 가 있었어요
답변
지난 며칠 동안이 문제가 발생했습니다. Omri Aharon이 위의 답변에서 말했듯이 다음과 유사한 소품 유형에 대한 정의를 추가하는 것이 중요합니다.
SomeClass.propTypes = {
someProp: PropTypes.number,
onTap: PropTypes.func,
};
클래스 외부에 소품 정의를 추가하는 것을 잊지 마십시오. 수업 바로 아래 / 위에 배치합니다. PropType (예 : PropTypes.number)에 대한 변수 유형 또는 접미사가 무엇인지 확실하지 않은 경우이 npm 참조를 참조하십시오 . PropTypes를 사용하려면 패키지를 가져와야합니다.
import PropTypes from 'prop-types';
linting 오류가 발생하면 다음 과 같이 소품 정의 끝에 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;
답변
이 대답이 우스꽝 스럽다는 것을 알고 있지만 버그가 해결되거나 도구를 업그레이드 할 때까지이 규칙을 비활성화하는 것이 좋습니다.
/* eslint-disable react/prop-types */ // TODO: upgrade to latest craco+eslint or Next.js?
또는 eslintrc에서 프로젝트 전체를 비활성화하십시오.
"rules": {
"react/prop-types": "off"
}
답변
문제는 handleClick의 흐름 주석에 있습니다. 나는 이것을 제거하고 @alik 덕분에 잘 작동합니다.
답변
문제 : 소품 유효성 검사, eslintreact / prop-types에서 ‘id1’이 누락되었습니다.
<div id={props.id1} >
...
</div>
아래 솔루션은 함수 구성 요소에서 작동했습니다.
let { id1 } = props;
<div id={id1} >
...
</div>
도움이 되었기를 바랍니다.
답변
나를 위해 eslint-plugin-react 를 최신 버전 7.21.5로 업그레이드 하면이 문제가 해결되었습니다.