Reputation: 1840
Looking through the official typechecking docs and for some reason ESLint is throwing an error when validating a deconstructed property.
Working Functional Component
import React from 'react';
import PropTypes from 'prop-types';
import { graphql } from 'react-apollo';
function MyComponentContainer(props) {
const { data: { loading, error, user } } = props;
if (loading) { return ( <Loader/> ); }
if (error) { return ( <Error /> ); }
return <MyComponent />;
}
MyComponentContainer.propTypes = {
data: PropTypes.shape({}),
};
MyComponentContainer.defaultProps = {
data: {},
};
export graphql(...)(...)
Error Class Component
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import { graphql } from 'react-apollo';
function MyComponentContainer extends Component{
constructor(){...}
const { data: { loading, error, user }} = this.props; <<<<<<< 'data' is missing in props validation
render(){
if (loading) { return ( <Loader/> ); }
if (error) { return ( <Error /> ); }
return <MyComponent />;
}
}
MyComponentContainer.propTypes = {
data: PropTypes.shape({}),
};
MyComponentContainer.defaultProps = {
data: {},
};
export graphql(...)(...)
.eslintrc
{
"extends": "airbnb",
"parser": "babel-eslint",
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true,
"modules": true,
"experimentalObjectRestSpread": true
}
},
"env":{
"browser": true,
"jest": true
},
"plugins": [
"react",
"jsx-a11y",
"import",
"jest"
],
"rules": {
"no-tabs": 0,
"no-mixed-spaces-and-tabs": 0,
camelcase: ["error", {properties: "never"}],
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
"jsx-a11y/anchor-is-valid": [ "error", {
"components": [ "Link" ],
"specialLink": [ "to" ],
"aspects": [ "noHref", "invalidHref", "preferButton" ]
}]
}
}
In a functional component ESLint is behaving as expected. However when applying the same method to a class component, unable to validate data. I thought this may be some type of scoping issue, but everything I've tried 'data' doesn't get validated. Looked through quite a few examples and it appears props are being declared properly but maybe I've overlooked something?
Upvotes: 1
Views: 858
Reputation: 1840
Ok, found another example in where it needs to be declared.
function MyComponentContainer extends Component{
static propTypes = {
data: PropTypes.shape({}),
};
static defaultProps = {
data: {},
};
constructor(){...}
const { data: { loading, error, user }} = this.props;
render(){
if (loading) { return ( <Loader/> ); }
if (error) { return ( <Error /> ); }
return <MyComponent />;
}
}
Note: propTypes need to be declared before constructor
or that will throw another Lint error.
Upvotes: 1