ESLintは、reactプロジェクトでこのエラーを表示しています。
ESLint-コンポーネントは純粋関数(react prefer/stateless関数)として記述される必要があります
コンポーネントの最初の行を指します。
export class myComponent extends React.Component {
render() {
return (
//stuff here
);
}
}
このエラーを取り除くにはどうすればよいですか?
2つの選択肢。
警告を一時的に無効にする
(テストされていません。これを行う方法は複数あります。)
// eslint-disable-next-line react/prefer-stateless-function
export class myComponent extends React.Component {
...
}
純粋なステートレスコンポーネントを使用
戻り値はレンダリングされるものです(例えば、基本的にクラスベースのコンポーネントのrender
メソッドを書いています:
export const myComponent = () => {
return (
// JSX here
)
}
(または、それがあなたのものなら、非ES6表記を使用してください。)
他のサポートロジックを持たないこのようなコンポーネントの場合、暗黙的なリターンを好みます。
export MyComponent = () =>
<div>
// Stuff here
</div>
これは好みの問題です。ただし、React命名規則に従って、すべてのコンポーネントを大文字で開始する必要があります。
ESLintは、複数行のJSX式の周りに欠落しているかっこについて文句を言う場合があるため、そのルールを無効にするか、かっこを使用します。
小道具が必要な場合、それらは関数の引数として渡されます:
const MyComponent = (props) =>
<div>
<Something someProp={props.foo} />
</div>
export MyComponent
また、便宜上、パラメーターを通常どおりに分解できます。
const MyComponent = ({ foo }) =>
<div>
<Something someProp={foo} />
</div>
これにより、ローカル変数を使用している場合、暗黙的な戻り値が少し簡単になります。宣言しない限り、PropTypes
がないことに関するESLint警告が表示されます。それはクラスではないので、クラスでstatic propTypes
を単純に使用することはできないため、関数にアタッチする必要があります(多くの人がとにかく好みます)。
コンポーネントをステートレス関数として記述します。
export myComponent = () => { //stuff here };
Reactには、実際には2つのスタイルの定義コンポーネントがあります。機能コンポーネント(小道具からReactコンポーネントへの単なる関数です)とクラスコンポーネントです。
それらの主な違いは、クラスコンポーネントにstate
とcomponentDidMount
、componentDidUpdate
などのライフサイクルメソッドを含めることができることです。
ライフサイクルメソッドの状態が不要な場合は常に、コンポーネントをステートレス関数として記述する必要があります。ステートレスコンポーネントは一般的に推論が容易だからです。
機能コンポーネントを作成するには、単一の引数を取る関数を作成します。この引数は、コンポーネントの小道具を受け取ります。したがって、this.props
を使用してコンポーネントの小道具にアクセスすることはありません。関数の引数を使用するだけです。
props
に依存している場合、ステートレス関数を書き出さずにこのエラーを修正するより良い(多少議論の余地がある)方法があります- PureComponent を記述し、このeslintを使用するルール [ソース] :
"react/prefer-stateless-function": [2, { "ignorePureComponents": true }],
上記のルールでは、次のスニペットが有効です(props
に依存するため)
class Foo extends React.PureComponent {
render() {
return <div>{this.props.foo}</div>;
}
}
ReactチームはSFCを中心に最適化を構築する予定ですが、まだ最適化されていません。したがって、それが発生するまで、SFCs
はPureComponents
を超える利点を提供しません。実際、無駄なレンダリングを防ぐことはできないため、わずかに悪化します。
このエラーは、クラスにライフサイクルメソッドまたはコンストラクターがない場合にのみ発生します。これを解決するには、lintプロパティを無効にするか、純粋関数として作成するか、クラスのコンストラクターを作成する必要があります。
次のようなconstructor()を追加します。
exports class myComponent extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<div>Hello</div>
);
}
}
Jsxテンプレートをレンダリングし、constructor(props)
で状態を宣言しない場合は、コンポーネントをpropsの純粋な関数として記述し、class
キーワードを使用して定義しないでください。
例.
export const myComponent = () => (
// jsx goes here
);
export class myComponent extends PureComponent {
...
}
const myComponent = () => {
return (
//stuff here
);
};
export default myComponent;
そして、app.jsファイルでは、クラスの場合と同様にこのコンポーネントをインポートするだけです
import myComponent from './myComponent.js'
として呼び出す
<myComponent />
確実に機能します。