あなたは正しい考えを持っています。コンポーネントがいくつかの小道具を取り込んでレンダリングする以外に機能しない場合は、機能を使用してください。これらは、同じ小道具が与えられた場合、常に同じようにレンダリングおよび動作するため、これらを純粋な関数と考えることができます。また、ライフサイクルメソッドを気にしないか、独自の内部状態を持っています。
これらは軽量であるため、これらの単純なコンポーネントを機能コンポーネントとして作成することはかなり標準的です。
状態を保持するなど、コンポーネントにさらに機能が必要な場合は、代わりにクラスを使用してください。
詳細:https : //facebook.github.io/react/docs/reusable-components.html#es6-classes
編集:上記のほとんどは、React Hooksが導入されるまでは真実でした。
componentDidUpdate
で複製できますuseEffect(fn)
。fn
は、再レンダリング時に実行される関数です。
componentDidMount
メソッドはを使用して複製できますuseEffect(fn, [])
。ここで、fn
は再レンダリング時に実行する関数[]
であり、コンポーネントが再レンダリングするオブジェクトの配列です(少なくとも1つが前回のレンダリング以降に値を変更した場合のみ)。何もないので、useEffect()
最初のマウントで1回実行されます。
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
機能コンポーネントよりもクラスを使用する場合の推奨事項に関して、Facebookは可能な限り機能コンポーネントを使用することを正式に推奨しています。余談ですが、パフォーマンス上の理由から機能コンポーネントを使用しないことについて多くの人々が議論していると聞きました。
「イベント処理関数は、機能コンポーネントのレンダリングごとに再定義されます」
確かに、コンポーネントが本当に懸念されるような速度またはボリュームでレンダリングしているかどうかを検討してください。
そうであればuseCallback
、useMemo
フックを使用して関数を再定義することを防ぐことができます。ただし、これによりコードが(微視的に)パフォーマンスが低下する可能性があることに注意してください。
しかし正直なところ、Reactアプリで関数を再定義することがボトルネックになるとは聞いたことがありません。時期尚早の最適化はすべての悪の根源です-それが問題であるとき、これを心配してください