Using specific APIs insideReact.render()
should be avoided
This rule applies when specific APIs are used insideReact.render()
.
The below APIs cannot be used insideReact.render()
because it triggers nested component updates or accesses unmounted components:
ReactDOM.render()
ReactDOM.unmountComponentAtNode()
ReactDOM.findDOMNode()
In the above cases, React outputs a warning message. Therefore, these APIs should be called insidecomponentDidUpdate()
orcomponentDidMount()
instead ofReact.render()
.
For your reference, usingsetstate()
insideReact.render()
also triggers the nested component updates. This case is detected byREACT_BAD_UPDATE_STATE rule.
Noncompliant Code Example | Compliant Code Example | ||
---|---|---|---|
1 | import React from 'react'; | 1 | import React from 'react'; |
2 | import ReactDOM from 'react-dom'; | 2 | import ReactDOM from 'react-dom'; |
3 | 3 | ||
4 | export class MyComponent extends React.Component { | 4 | export class MyComponent extends React.Component { |
5 | componentDidMount() { | ||
6 | ReactDOM.findDOMNode(this.node).focus(); | ||
7 | } | ||
5 | render() { | 8 | render() { |
6 | ReactDOM.findDOMNode(this.node).focus(); // REACT_MISUSED_API_IN_RENDER alarm because the component is not mounted yet. | ||
7 | return ( | 9 | return ( |
8 | <div> | 10 | <div> |
9 | <input type="text" ref={(node) => this.node = node} /> | 11 | <input type="text" ref={(node) => this.node = node} /> |
10 | </div> | 12 | </div> |
11 | ); | 13 | ); |
12 | } | 14 | } |
13 | } | 15 | } |
import React from 'react';import ReactDOM from 'react-dom';export class MyComponent extends React.Component { render() { ReactDOM.findDOMNode(this.node).focus(); // REACT_MISUSED_API_IN_RENDER alarm because the component is not mounted yet. return ( <div> <input type="text" ref={(node) => this.node = node} /> </div> ); }}
import React from 'react';import ReactDOM from 'react-dom';export class MyComponent extends React.Component { componentDidMount() { ReactDOM.findDOMNode(this.node).focus(); } render() { return ( <div> <input type="text" ref={(node) => this.node = node} /> </div> ); }}
This rule was introduced in DeepScan 1.6.0-beta.
React Warning: A component is accessing findDOMNode inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.