У меня есть следующий код, бросок eslint:
реагировать / проп-типы 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,
}
}
javascript
reactjs
eslint
flowtype
Кристиан Камило Седеньо Гальего
источник
источник
const { children, onClickOut, ...filteredProps } = this.props;
static get propTypes() { return { children: PropTypes.any, onClickOut: PropTypes.func }; }
Ответы:
Вам нужно определить
propTypes
как статический получатель, если вы хотите его внутри объявления класса:static get propTypes() { return { children: PropTypes.any, onClickOut: PropTypes.func }; }
Если вы хотите определить его как объект, вам нужно определить его вне класса, например:
IxClickOut.propTypes = { children: PropTypes.any, onClickOut: PropTypes.func, };
Также лучше, если вы импортируете типы опор из
prop-types
, а неreact
, иначе вы увидите предупреждения в консоли (как подготовка к React 16 ):import PropTypes from 'prop-types';
источник
Вроде проблема в
eslint-plugin-react
.Он не может правильно определить, какие реквизиты были упомянуты,
propTypes
если вы аннотировали именованные объекты посредством деструктуризации в любом месте класса.Была аналогичная проблема в прошлом
источник
package.json
,.eslintrc
трудно сказать , почему он не подхватывает propTypeshandleClick
Я столкнулся с этой проблемой за последние пару дней. Как сказал Омри Аарон в своем ответе выше, важно добавить определения для ваших типов опор, подобные следующим:
SomeClass.propTypes = { someProp: PropTypes.number, onTap: PropTypes.func, };
Не забудьте добавить определения опор вне вашего класса. Я бы поместил его прямо под / над моим классом. Если вы не уверены, какой у вас тип переменной или суффикс для вашего PropType (например, PropTypes.number), обратитесь к этой справке npm . Чтобы использовать PropTypes, вы должны импортировать пакет:
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;
источник
Я знаю, что этот ответ смехотворен, но подумайте о том, чтобы просто отключить это правило, пока ошибки не будут исправлены или вы не обновите свой инструментарий:
/* eslint-disable react/prop-types */ // TODO: upgrade to latest craco+eslint or Next.js?
Или отключите весь проект в своем eslintrc:
"rules": { "react/prop-types": "off" }
источник
проблема в аннотации потока в handleClick, я удалил это и отлично работает, спасибо @alik
источник
Проблема: id1 отсутствует в проверке свойств, eslintreact / prop-types
Ниже решение работало в функциональном компоненте:
let { id1 } = props; <div id={id1} > ... </div>
Надеюсь, это поможет.
источник
Для меня обновление eslint-plugin-react до последней версии 7.21.5 исправило это
источник