ホームページ >ウェブフロントエンド >jsチュートリアル >関数コンポーネントは関数プログラミングと同じですか?
React 開発者は、React に 2 つのコンポーネント タイプがあるという事実をすでによく知っています。
「クラス」と「関数」について考えると、当然次のような疑問が生じます。
結局のところ、クラス コンポーネントが OOP に関連している場合、OOP の原則 (継承、カプセル化、ポリモーフィズムなど) がクラスベースのコンポーネントの開発を導くことができます。同様に、FP 原則は機能コンポーネントに影響を与える可能性があります。言い換えれば、これらのプログラミング パラダイムのベスト プラクティスを React プロジェクトに直接適用できます。
それでは、関数コンポーネントと関数プログラミングの間にはどのような関係があるのでしょうか?この記事では、このトピックについて詳しく説明します。
まず第一に、フレームワーク構文は本質的に、特定のドメインでの開発用にカスタマイズされた DSL (ドメイン固有言語) であることを明確にする必要があります。
たとえば、React はビューを構築するための DSL です。プラットフォームが異なれば、ビューの構築に使用するフレームワークも異なります。例:
これらのフレームワークは通常、同じ DSL (React 構文) に従います。この DSL は特定のプログラミング パラダイムに関連付けられていませんが、ビューの開発に適した言語機能のセットとして見なす必要があります。
React DSL の一部として:
これらの原則が開発の観点から有益である限り、DSL に統合できます。
たとえば、WelcomeMessage と LogoutButton で構成される次の機能コンポーネント Header について考えてみましょう。これは、OOP における継承よりも合成の原則を示しています。
<code class="language-javascript">function Header(props) { return ( <div> <WelcomeMessage name={props.name} /> <LogoutButton onClick={props.onLogout} /> </div> ); }</code>
同様に、クラス コンポーネント Cpn について考えてみましょう。ここでは、状態カウントは、突然変異 (this.state.count) によってではなく、不変データを指定して this.setState を呼び出すことによって更新されます。
<code class="language-javascript">class Cpn extends React.Component { // ... onClick() { const count = this.state.count; this.setState({ count: count + 1 }); } render() { // ... } }</code>不変データの使用は FP の原則を反映しています。
したがって、React の機能を検討するときは、次の 3 つのステップを考慮する必要があります:
関数コンポーネントは、React の関数プログラミングの具体化としてのみ見るべきではありません。
前述の 3 段階の思考プロセスを使用して、機能コンポーネントの進化を探ってみましょう。 React の開発哲学は、次の式で最もよく表現されます:
<code class="language-javascript">function Header(props) { return ( <div> <WelcomeMessage name={props.name} /> <LogoutButton onClick={props.onLogout} /> </div> ); }</code>
このコンセプトを実現するには、2 つの重要な要素が必要です:
ここでは、FP からの不変データの方が、データ スナップショットのキャリアとして適しています。これが、React の状態が不変である理由です。状態の本質はスナップショットです。
関数マッピングのキャリアには特定の要件はありません。 React では、すべての更新が再レンダリングをトリガーし、レンダリング プロセス自体が関数マッピング プロセスとなります。入力は props と state、出力は JSX です。
対照的に、Vue コンポーネントは OOP 原則により準拠しています。次の Vue アプリ コンポーネントについて考えてみましょう:
<code class="language-javascript">class Cpn extends React.Component { // ... onClick() { const count = this.state.count; this.setState({ count: count + 1 }); } render() { // ... } }</code>
コンポーネントのセットアップ メソッドは、初期化中に 1 回だけ実行されます。後続の更新操作は、クロージャ内の同じデータに対して操作されます。これは、OOP のインスタンスの概念に対応します。
React は関数マッピングのキャリアに特別な要件を課していないため、クラス コンポーネントと関数コンポーネントの両方が実行可能なオプションです。
多くの人は、フックを通じてロジックの再利用性を向上させることが、関数型コンポーネントがクラス コンポーネントよりも優れている主な理由であると信じています。ただし、デコレータベースのクラス開発モデルは、特に TypeScript と組み合わせた場合、ロジックを再利用する効果的な方法であることが証明されています。
本当の理由は、関数コンポーネントが UI = fn(snapshot) の概念をより適切に実装できるためです。
前に述べたように、式内のスナップショットは状態のスナップショットを表し、React では次のものが含まれます。
クラス コンポーネントでは、これらの副作用ロジックがさまざまなライフサイクル メソッドに分散されているため、React の制御が困難になります。ただし、関数コンポーネントでは:
<code>UI = fn(snapshot);</code>使用法:
<code class="language-javascript">const App = { setup(initialProps) { const count = reactive({ count: 0 }); const add = () => { count.value++; }; return { count, add }; }, template: "...omitted" };</code>つまり、機能コンポーネントは副作用を制御可能な状態に保ち、同じスナップショット入力に対して一貫した出力を提供します。これは FP の純粋関数の概念と一致しており、そのため React では関数コンポーネントが主流の選択肢となっています。
結論
UI = fn(snapshot) のコアコンセプトを実装するのに最も適切なキャリアです。 React はさまざまなプログラミング パラダイムからの優れたアイデアを統合していますが、その中で FP が最も大きな影響力を持っています。最終的には、あらゆるデザインの選択が全体的なアイデアに役立ちます。
Leapcell は、Web ホスティング、非同期タスク、Redis 用の新世代サーバーレス プラットフォームです:
多言語サポート
無制限のプロジェクトを無料でデプロイ
比類のない費用対効果
簡素化された開発者エクスペリエンス
簡単な拡張性と高いパフォーマンス
詳しくはドキュメントをご覧ください。
X でフォローしてください: @LeapcellHQ
ブログを読む
以上が関数コンポーネントは関数プログラミングと同じですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。