[解決済み】ES6クラスベースのReactコンポーネントと機能的なES6 Reactコンポーネントの使い分けはいつ?
質問
Reactの学習に時間を費やした後、コンポーネントを作成するための2つの主要なパラダイムの違いを理解しました。
私の質問は、どのような場合にどちらを使うべきか、またその理由は何かということです。また、どちらか一方を使うことの利点やトレードオフは何ですか?
ES6のクラスです。
import React, { Component } from 'react';
export class MyComponent extends Component {
render() {
return (
<div></div>
);
}
}
機能的です。
const MyComponent = (props) => {
return (
<div></div>
);
}
そのコンポーネントで操作する状態がないときはいつでも関数的だと思うのですが、そうなんでしょうか?
ライフサイクルメソッドを使用する場合は、クラスベースのコンポーネントを使用するのがベストかもしれませんね。
どのように解決するのですか?
古い回答です。 あなたの考えは正しいです。コンポーネントがプロップを受け取ってレンダリングする以上のことをしないのであれば、関数型にしましょう。同じプロップがあれば、常に同じようにレンダリングし、同じように動作するので、これらは純粋関数と考えることができます。また、ライフサイクルメソッドを気にしたり、独自の内部状態を持ったりすることもありません。
軽量なので、こうしたシンプルなコンポーネントを機能部品として書くのは、ごく普通のことです。
状態を保持するなど、より多くの機能が必要な場合は、代わりにクラスを使用します。
詳しくはこちら https://facebook.github.io/react/docs/reusable-components.html#es6-classes
新しい回答 : 上記の多くは、React Hooksが導入されるまでは、真実でした。
-
componentDidUpdate
で複製することができます。useEffect(fn)
ここでfn
は、再レンダリング時に実行される関数です。 -
componentDidMount
メソッドを複製することができます。useEffect(fn, [])
ここでfn
は再レンダリング時に実行される関数であり[]
は、コンポーネントが再レンダリングするオブジェクトの配列で、少なくとも 1 つが前回のレンダリング以降に値を変更した場合にのみ、再レンダリングされます。何もない場合はuseEffect()
は、最初のマウント時に一度だけ実行されます。 -
state
で複製することができます。useState()
であり,その戻り値は状態の参照と状態を設定できる関数に分解できる(すなわち.const [state, setState] = useState(initState)
). 例で説明すると、もっとわかりやすいかもしれません。
const Counter = () => {
const [count, setCount] = useState(0)
const increment = () => {
setCount(count + 1);
}
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>+</button>
</div>
)
}
default export Counter
小さな余談ですが、パフォーマンス上の理由から機能コンポーネントを使わないという議論を何人も耳にしたことがあります。
関数型コンポーネントでは、レンダリングごとにイベント処理関数が再定義されます。
しかし、あなたのコンポーネントが本当にそのような速度やボリュームでレンダリングしているのかどうか、よく考えてみてください。
もしそうであれば、関数再定義の際に
useCallback
と
useMemo
フックを使用します。しかし、これによってあなたのコードが(微視的に)次のようになる可能性があることを心に留めておいてください。
パフォーマンス低下
.
しかし、正直なところ、Reactアプリで関数の再定義がボトルネックになったという話は聞いたことがありません。早すぎる最適化は諸悪の根源 - 問題が起きてから心配しましょう
関連
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] React-routerのURLを更新したり、手動で書き込んだりするとうまくいかない
-
[解決済み] ES6インポートで中括弧を使用するのはどのような場合ですか?
-
[解決済み] Reactコンポーネントに条件付きで属性を追加するにはどうすればよいですか?
-
[解決済み] Reactでes6クラスを使うときの「super()」と「super(props)」の違いとは?
-
[解決済み] JSX.ElementとReactNodeとReactElementの使い分けは?
-
[解決済み】ES6クラス変数の代替品
-
[解決済み】Reactの機能的なステートレスコンポーネント、PureComponent、Component、どのような違いがあり、いつ何を使うべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み】NodeJS "ESモジュールをロードするためにインポートを使用する必要があります。"
-
[解決済み】Javascript - ERR_CONTENT_LENGTH_MISMATCH
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】 Uncaught Reference Error: stLight is not defined (in Chrome only)
-
[解決済み】SyntaxError: 期待された式が、'<'を得た。
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない