Rules for React component definition, naming, structure, and best practices. These rules ensure components follow React conventions and avoid common anti-patterns.
Rules governing how React components should be defined and structured.
const componentRules = {
/** Prevent missing displayName in React component definition */
'react/display-name': ESLintRule;
/** Enforce ES5 or ES6 class for returning value in render function */
'react/require-render-return': ESLintRule;
/** Prevent multiple component definition per file */
'react/no-multi-comp': ESLintRule;
/** Prevent usage of setState */
'react/no-set-state': ESLintRule;
/** Enforce stateless components to be written as a pure function */
'react/prefer-stateless-function': ESLintRule;
/** Enforce ES6 class instead of createClass for React components */
'react/prefer-es6-class': ESLintRule;
};Usage Examples:
// ✓ Good - Component with displayName
function MyComponent() {
return <div>Hello</div>;
}
MyComponent.displayName = 'MyComponent';
// ✗ Bad - Missing displayName (when rule is enabled)
const MyComponent = () => <div>Hello</div>;
// ✓ Good - Render method returns JSX
class MyComponent extends React.Component {
render() {
return <div>Hello</div>;
}
}
// ✗ Bad - Render method doesn't return
class MyComponent extends React.Component {
render() {
console.log('rendering');
}
}Rules for component naming conventions and internal structure.
const namingRules = {
/** Enforce boolean prop naming conventions */
'react/boolean-prop-naming': ESLintRule;
/** Enforce component methods order */
'react/sort-comp': ESLintRule;
/** Enforce function component definition style */
'react/function-component-definition': ESLintRule;
/** Prevent usage of this in stateless functional components */
'react/no-this-in-sfc': ESLintRule;
/** Enforce specific placement for static properties */
'react/static-property-placement': ESLintRule;
};Usage Examples:
// ✓ Good - Boolean prop with proper naming
<Component isVisible={true} hasData={false} />
// ✗ Bad - Boolean prop without is/has prefix
<Component visible={true} data={false} />
// ✓ Good - Proper component method order
class MyComponent extends React.Component {
static propTypes = {};
constructor() {}
componentDidMount() {}
render() {}
}
// ✗ Bad - Methods in wrong order
class MyComponent extends React.Component {
render() {}
componentDidMount() {}
constructor() {}
static propTypes = {};
}Rules for managing component state and props properly.
const statePropsRules = {
/** Prevent direct mutation of this.state */
'react/no-direct-mutation-state': ESLintRule;
/** Prevent usage of this.state within a this.setState */
'react/no-access-state-in-setstate': ESLintRule;
/** Prevent usage of setState in constructors */
'react/state-in-constructor': ESLintRule;
/** Prevent unused state */
'react/no-unused-state': ESLintRule;
/** Prevent unused class component methods */
'react/no-unused-class-component-methods': ESLintRule;
};Usage Examples:
// ✓ Good - Using setState to update state
this.setState({ count: this.state.count + 1 });
// ✗ Bad - Direct state mutation
this.state.count = this.state.count + 1;
// ✓ Good - Using functional setState to avoid state dependency
this.setState(prevState => ({ count: prevState.count + 1 }));
// ✗ Bad - Reading current state in setState
this.setState({ count: this.state.count + 1 });
// ✓ Good - State initialized in constructor
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
}
// ✗ Bad - State as class property (when rule enforces constructor)
class MyComponent extends React.Component {
state = { count: 0 };
}Rules preventing common React anti-patterns and enforcing best practices.
const patternRules = {
/** Prevent usage of findDOMNode */
'react/no-find-dom-node': ESLintRule;
/** Prevent usage of isMounted */
'react/no-is-mounted': ESLintRule;
/** Prevent usage of the return value of React.render */
'react/no-render-return-value': ESLintRule;
/** Prevent usage of string references */
'react/no-string-refs': ESLintRule;
/** Prevent common typos */
'react/no-typos': ESLintRule;
/** Prevent usage of UNSAFE_ methods */
'react/no-unsafe': ESLintRule;
/** Prevent creating unstable components inside components */
'react/no-unstable-nested-components': ESLintRule;
};Usage Examples:
// ✓ Good - Using refs properly
const MyComponent = () => {
const inputRef = useRef(null);
return <input ref={inputRef} />;
};
// ✗ Bad - Using findDOMNode
import { findDOMNode } from 'react-dom';
const node = findDOMNode(this);
// ✓ Good - Avoiding string refs
<input ref={inputRef} />
// ✗ Bad - Using string refs
<input ref="myInput" />
// ✓ Good - Define components outside render
const ChildComponent = () => <div>Child</div>;
const Parent = () => <ChildComponent />;
// ✗ Bad - Creating components inside render
const Parent = () => {
const ChildComponent = () => <div>Child</div>;
return <ChildComponent />;
};Rules for advanced component patterns like forwardRef and HOCs.
const advancedRules = {
/** Ensure forwardRef is used correctly */
'react/forward-ref-uses-ref': ESLintRule;
/** Prevent usage of arrow functions in component lifecycle methods */
'react/no-arrow-function-lifecycle': ESLintRule;
/** Prevent object type as default prop */
'react/no-object-type-as-default-prop': ESLintRule;
/** Enforce exact prop types */
'react/prefer-exact-props': ESLintRule;
/** Enforce read-only props */
'react/prefer-read-only-props': ESLintRule;
};Usage Examples:
// ✓ Good - forwardRef with ref usage
const MyComponent = React.forwardRef((props, ref) => {
return <input ref={ref} {...props} />;
});
// ✗ Bad - forwardRef without using ref
const MyComponent = React.forwardRef((props, ref) => {
return <input {...props} />;
});
// ✓ Good - Regular method in lifecycle
class MyComponent extends React.Component {
componentDidMount() {
this.doSomething();
}
doSomething() {
// implementation
}
}
// ✗ Bad - Arrow function in lifecycle
class MyComponent extends React.Component {
componentDidMount = () => {
this.doSomething();
}
}Specialized rules for specific HTML elements and form handling.
const elementRules = {
/** Enforce button elements to have explicit type attribute */
'react/button-has-type': ESLintRule;
/** Enforce onChange or readonly for checked property */
'react/checked-requires-onchange-or-readonly': ESLintRule;
/** Prevent usage of children with iframe elements */
'react/iframe-missing-sandbox': ESLintRule;
/** Prevent children for void DOM elements */
'react/void-dom-elements-no-children': ESLintRule;
/** Prevent adjacent inline elements not separated by whitespace */
'react/no-adjacent-inline-elements': ESLintRule;
};Usage Examples:
// ✓ Good - Button with explicit type
<button type="button">Click me</button>
<button type="submit">Submit</button>
// ✗ Bad - Button without type
<button>Click me</button>
// ✓ Good - Controlled checkbox with onChange
<input type="checkbox" checked={isChecked} onChange={handleChange} />
// ✓ Good - Readonly checkbox
<input type="checkbox" checked={isChecked} readOnly />
// ✗ Bad - Checked without onChange or readOnly
<input type="checkbox" checked={isChecked} />
// ✓ Good - iframe with sandbox
<iframe src="https://example.com" sandbox="allow-scripts" />
// ✗ Bad - iframe without sandbox
<iframe src="https://example.com" />Rules for proper usage of React Hooks patterns.
const hookRules = {
/** Enforce destructuring and symmetric naming of useState hook value and setter variables */
'react/hook-use-state': ESLintRule;
};Usage Examples:
// ✓ Good - Proper useState destructuring
const [count, setCount] = useState(0);
const [isVisible, setIsVisible] = useState(false);
// ✗ Bad - Non-symmetric naming
const [count, updateCount] = useState(0);
const [isVisible, changeVisibility] = useState(false);Most component rules accept configuration options to customize their behavior:
{
"rules": {
"react/display-name": ["error", {
"ignoreTranspilerName": false,
"checkContextObjects": false
}],
"react/boolean-prop-naming": ["error", {
"rule": "^(is|has)[A-Z]([A-Za-z0-9]?)+",
"message": "Boolean prop names should start with 'is' or 'has'"
}],
"react/function-component-definition": ["error", {
"namedComponents": "arrow-function",
"unnamedComponents": "arrow-function"
}],
"react/sort-comp": ["error", {
"order": [
"static-variables",
"static-methods",
"instance-variables",
"lifecycle",
"everything-else",
"render"
]
}]
}
}