Reactで柔軟なコンポーネント設計!Compound Componentsパターンをマスターしよう
目次
はじめに
Reactでは、コンポーネント設計が非常に重要です。今回紹介するCompound Componentsパターンは、コンポーネント間の関係を明確にし、再利用性を高めるための強力な手法です。
Compound Componentsパターンとは
Compound Componentsパターンは、親子コンポーネント間で柔軟に制御を行う設計パターンです。子コンポーネントは親コンポーネントからのプロパティを受け取り、個別に機能します。
Compound Componentsを使った例
Tabs.js
import React, { useState, createContext, useContext } from 'react';
const TabContext = createContext(); // コンテキストを作成
export const Tabs = ({ children }) => {
const [activeTab, setActiveTab] = useState(0); // アクティブなタブの状態
return (
<TabContext.Provider value={{ activeTab, setActiveTab }}>
<div>{children}</div> // 子コンポーネントをレンダリング
</TabContext.Provider>
);
};
export const Tab = ({ title, children }) => {
const { activeTab, setActiveTab } = useContext(TabContext); // 親コンポーネントからの状態を取得
const isActive = activeTab === title; // アクティブなタブか判定
return (
<div>
<button onClick={() => setActiveTab(title)}>{title}</button>
{isActive && <div>{children}</div>} // アクティブな場合のみコンテンツを表示
</div>
);
};
この例では、Tabs
コンポーネントが親で、Tab
コンポーネントが子です。親は現在のアクティブなタブを状態として保持し、子にコンテキストを通じて渡します。子コンポーネントはアクティブなタブかどうかを判定し、内容を表示します。
Compound Componentsを使わない例
Tabs.js
import React, { useState } from 'react';
export const Tabs = ({ titles, children }) => {
const [activeTab, setActiveTab] = useState(0); // アクティブなタブの状態
return (
<div>
{titles.map((title, index) => (
<button onClick={() => setActiveTab(index)} key={index}>
{title}
</button>
))}
{children[activeTab]} // アクティブなタブのコンテンツを表示
</div>
);
};
この設計では、タブのタイトルと内容が分離されており、Tabs
コンポーネントが全てのロジックを制御します。子コンポーネントは単に表示されるだけで、独立した存在ではありません。
対比とメリット
- 柔軟性: Compound Componentsを使用すると、より柔軟な設計が可能。
- 再利用性: 各子コンポーネントが独立しているため、再利用しやすい。
- 可読性: コンポーネントの関係が明確で、コードの可読性が向上。
- メンテナンス: メンテナンスが容易。
まとめ
Compound Componentsパターンは、Reactのコンポーネント設計を向上させる素晴らしい手法です。この記事を通じて、この強力なパターンをマスターし、より洗練されたReactアプリケーションの開発を進めてください!
いいねやシェアは、今後の記事作成の励みになります。感想や質問があれば、コメント欄にお気軽にどうぞ!