Reactの開発において、Outletコンポーネントは、柔軟で階層的なレイアウトを作成するための非常に強力なツールです。特に、複数のページで共通部分を共有しつつ、各ページごとに異なる内容を動的に表示したい場合に、その威力を発揮します。本記事では、React Routerが提供するOutletを活用して、親子関係に基づいたネストレイアウトを効率的に構築する方法を徹底解説します。初心者でも理解できるよう、基本概念から実践的なアプリ構築例までをステップバイステップで説明します。この記事を読むことで、再利用性と保守性を兼ね備えたモダンなフロントエンド開発の基礎を習得できるでしょう。
Outletコンポーネントの基本概念と用途
ReactのOutletコンポーネントは、React Routerが提供する機能の一部で、ネストされたルート構造を作成する際に使用されます。親ルートで指定したレイアウトやUIを保持しつつ、子ルートごとの異なるコンテンツを柔軟に表示できるのが特徴です。
Outletの基本概念
Outletは、親ルートに設定された「プレースホルダー」のような役割を果たします。このプレースホルダーには、現在アクティブになっている子ルートのコンテンツが差し込まれます。これにより、共通するレイアウトと個別のコンテンツを簡単に切り替えることが可能になります。
用途
Outletの主な用途は以下の通りです:
- 共通レイアウトの作成: 親コンポーネントでナビゲーションバーやフッターを設定し、子ルートでメインコンテンツを切り替える構造を実現します。
- ネストされたルート構造: URLの階層に応じたページ遷移を簡単に管理できます。
- コードの再利用性向上: 親子間で分担されたコンポーネント構造により、コードの保守性が向上します。
動作の仕組み
Outletは、React Routerのルート設定において children
プロパティを用いることで自動的に機能します。以下の簡単なコード例でその仕組みを示します。
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Layout />}>
<Route path="home" element={<Home />} />
<Route path="about" element={<About />} />
</Route>
</Routes>
</Router>
);
}
function Layout() {
return (
<div>
<header>Header</header>
<Outlet />
<footer>Footer</footer>
</div>
);
}
function Home() {
return <h1>Home Page</h1>;
}
function About() {
return <h1>About Page</h1>;
}
この例では、Layout
コンポーネントに記述された <Outlet />
が、現在のアクティブな子ルート(例: /home
や /about
)のコンテンツを差し込む役割を果たします。
React Routerの導入と設定方法
React Routerは、Reactアプリケーションにルーティング機能を追加するためのライブラリです。Outletコンポーネントを利用するためには、まずReact Routerをインストールし、基本的な設定を行う必要があります。以下では、インストール手順から初期設定までを説明します。
React Routerのインストール
React Routerを使用するには、react-router-dom
パッケージをインストールします。以下のコマンドをターミナルで実行してください。
npm install react-router-dom
また、TypeScriptを使用している場合は、型定義もインストールします。
npm install @types/react-router-dom
基本的な設定
React Routerを有効にするには、ルート設定を行う必要があります。<BrowserRouter>
、<Routes>
、および<Route>
を使用してルート構造を定義します。
以下の例は、React Routerの基本構成を示しています。
import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>
);
}
function Home() {
return <h1>Home Page</h1>;
}
function About() {
return <h1>About Page</h1>;
}
export default App;
このコードでは、<BrowserRouter>
がアプリ全体のルート設定を管理し、<Routes>
と<Route>
が個々のルートを定義しています。
Outletを使用するためのネスト設定
Outletを使う場合、親ルートと子ルートを階層的に定義します。以下はその具体例です。
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Layout from './Layout';
import Home from './Home';
import About from './About';
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Layout />}>
<Route path="home" element={<Home />} />
<Route path="about" element={<About />} />
</Route>
</Routes>
</Router>
);
}
export default App;
ポイント解説
- 親ルートの設定:
/
でアクセスされる親ルートに<Layout />
を割り当てます。 - 子ルートの設定: 親ルート内で、
<Route>
をネストすることで子ルートを定義します。 - Outletの活用:
Layout
コンポーネントに<Outlet />
を挿入することで、現在アクティブな子ルートが表示されます。
この設定により、ReactアプリケーションでOutletを活用したネスト構造が可能になります。次のセクションでは、ネストされたルーティングの具体的な構築方法について詳しく解説します。
ネストされたルーティングの構築方法
ネストされたルーティングを構築することで、複数のページで共通のレイアウトを持ちながら、個別のコンテンツを動的に切り替えることができます。このセクションでは、Outletを使ってネストされたルート構造を実現する具体的な手順を解説します。
ルート構造の設計
ネストされたルーティングでは、親ルートを定義し、その中に子ルートを階層的に配置します。以下の例では、親コンポーネントとしてLayout
を使用し、/home
と/about
という2つの子ルートを設定します。
コード例: ネストされたルーティング
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Layout from './Layout';
import Home from './Home';
import About from './About';
function App() {
return (
<Router>
<Routes>
{/* 親ルート */}
<Route path="/" element={<Layout />}>
{/* 子ルート */}
<Route path="home" element={<Home />} />
<Route path="about" element={<About />} />
</Route>
</Routes>
</Router>
);
}
export default App;
ポイント解説
- 親ルートの設定:
親ルート/
に<Layout />
コンポーネントを割り当て、共通のUIを構築します。 - 子ルートの定義:
子ルート/home
と/about
をネストし、それぞれのパスに対応するコンポーネントを指定します。 - Outletの活用:
Layout
コンポーネント内に<Outlet />
を配置して、現在の子ルートに応じたコンテンツを表示します。
親コンポーネント(Layout)の実装
import { Outlet } from 'react-router-dom';
function Layout() {
return (
<div>
<header>
<h1>My Website</h1>
<nav>
<a href="/home">Home</a> | <a href="/about">About</a>
</nav>
</header>
<main>
<Outlet /> {/* 子ルートがここにレンダリングされる */}
</main>
<footer>© 2024 My Website</footer>
</div>
);
}
export default Layout;
説明
<Outlet />
がプレースホルダーとして機能し、現在アクティブな子ルートのコンポーネントがここに表示されます。- ナビゲーションリンクを作成することで、異なる子ルートへ簡単に移動できます。
子コンポーネントの実装
以下は、子ルートのコンポーネントHome
とAbout
の例です。
function Home() {
return <h2>Welcome to the Home Page</h2>;
}
export default Home;
function About() {
return <h2>About Us</h2>;
}
export default About;
動作確認
アプリを起動して以下を確認してください:
/home
にアクセスすると、Home
コンポーネントが<Outlet />
に差し込まれて表示されます。/about
にアクセスすると、About
コンポーネントが表示されます。
これにより、Outletを使ったネストされたルート構造が完成します。次のセクションでは、親コンポーネントと子コンポーネントの役割と設計について詳しく説明します。
親コンポーネントと子コンポーネントの設計
ネストされたルーティングを効果的に活用するためには、親コンポーネントと子コンポーネントの役割を明確に分けて設計することが重要です。このセクションでは、それぞれの役割と設計ポイントについて解説します。
親コンポーネントの役割
親コンポーネントは、アプリケーション全体または一部の共通レイアウトを管理します。ここには、ナビゲーションバーやフッターなど、どのページでも共有されるUI要素を配置します。
設計のポイント
- 共通UIの配置:
ナビゲーションメニュー、ロゴ、フッターなどの要素を親コンポーネントにまとめます。 - Outletの活用:
<Outlet />
を使って、子ルートに応じたコンテンツを動的に差し込む仕組みを作ります。 - スタイルの統一:
親コンポーネントでCSSやテーマを管理することで、アプリ全体の統一感を確保します。
親コンポーネントの例
import { Outlet, Link } from 'react-router-dom';
function Layout() {
return (
<div className="layout">
<header>
<h1>My Website</h1>
<nav>
<Link to="/home">Home</Link> | <Link to="/about">About</Link>
</nav>
</header>
<main>
<Outlet /> {/* 子ルートのコンテンツがここに表示される */}
</main>
<footer>© 2024 My Website</footer>
</div>
);
}
export default Layout;
子コンポーネントの役割
子コンポーネントは、親コンポーネントに差し込まれる具体的なコンテンツを管理します。各子ルートに対応するページ内容を定義します。
設計のポイント
- 単一責任の原則:
子コンポーネントは、特定のページや機能に専念し、特定の役割だけを果たすようにします。 - 再利用性の確保:
汎用的なコンポーネントを作ることで、他の子ルートでも再利用可能にします。 - 親とのデータ連携:
必要に応じて、親コンポーネントからプロパティを受け取る仕組みを構築します。
子コンポーネントの例
function Home() {
return (
<section>
<h2>Home Page</h2>
<p>Welcome to the home page of our website!</p>
</section>
);
}
export default Home;
function About() {
return (
<section>
<h2>About Us</h2>
<p>This website is created to demonstrate React Router features.</p>
</section>
);
}
export default About;
親子コンポーネント間の連携
親コンポーネントから子コンポーネントにデータや関数を渡す際には、Reactのprops
を利用します。以下は親から子にデータを渡す例です。
データ渡しの例
function Layout() {
const siteName = "My Website";
return (
<div>
<header>
<h1>{siteName}</h1>
</header>
<main>
<Outlet context={{ siteName }} />
</main>
</div>
);
}
function Home() {
const { siteName } = React.useOutletContext();
return <p>Welcome to {siteName}!</p>;
}
設計のメリット
- 保守性の向上:
親子関係を明確にすることで、コードの見通しが良くなり、修正が容易になります。 - 再利用性の向上:
コンポーネントを再利用可能にすることで、開発効率が向上します。 - 可読性の向上:
明確な役割分担により、コードが直感的に理解しやすくなります。
次のセクションでは、動的ルーティングとOutletの連携方法について解説します。
動的ルーティングとOutletの連携
動的ルーティングとは、URLのパラメータを利用して動的に変化するページを作成する仕組みです。React RouterとOutletを組み合わせることで、柔軟に動的なコンテンツを表示できます。このセクションでは、動的ルートの設定方法とその実践例を紹介します。
動的ルーティングの基本
React Routerでは、:paramName
という形式でルートパラメータを定義します。このパラメータは、URLに応じた動的なデータを取得するために使用されます。
コード例: 動的ルートの設定
以下の例では、:id
というパラメータを持つ動的ルートを作成し、それに基づいたページをOutletを介して表示します。
import { BrowserRouter as Router, Routes, Route, useParams } from 'react-router-dom';
function App() {
return (
<Router>
<Routes>
{/* 親ルート */}
<Route path="items" element={<ItemsLayout />}>
{/* 動的ルート */}
<Route path=":id" element={<ItemDetail />} />
</Route>
</Routes>
</Router>
);
}
export default App;
親コンポーネント(ItemsLayout)の実装
親コンポーネントでは、<Outlet />
を利用して、動的ルートに応じたコンテンツを表示します。
import { Outlet, Link } from 'react-router-dom';
function ItemsLayout() {
return (
<div>
<h1>Items</h1>
<nav>
<Link to="/items/1">Item 1</Link> | <Link to="/items/2">Item 2</Link>
</nav>
<main>
<Outlet /> {/* 動的ルートのコンテンツがここに表示される */}
</main>
</div>
);
}
export default ItemsLayout;
子コンポーネント(ItemDetail)の実装
子コンポーネントでは、useParams
フックを利用してURLからパラメータを取得します。
import { useParams } from 'react-router-dom';
function ItemDetail() {
const { id } = useParams(); // URLから:idを取得
return (
<div>
<h2>Item Detail</h2>
<p>Currently viewing item with ID: {id}</p>
</div>
);
}
export default ItemDetail;
動作確認
- アプリを起動し、
/items/1
または/items/2
にアクセスします。 ItemsLayout
が共通レイアウトを提供し、ItemDetail
がURLパラメータに基づいた動的なコンテンツを表示します。
応用例: 動的データのフェッチ
動的ルートでは、APIを利用してデータを取得するケースが一般的です。以下の例では、IDに基づいてAPIからデータを取得する方法を示します。
import { useParams } from 'react-router-dom';
import { useEffect, useState } from 'react';
function ItemDetail() {
const { id } = useParams();
const [item, setItem] = useState(null);
useEffect(() => {
fetch(`https://api.example.com/items/${id}`)
.then(response => response.json())
.then(data => setItem(data))
.catch(error => console.error('Error fetching item:', error));
}, [id]);
if (!item) return <p>Loading...</p>;
return (
<div>
<h2>{item.name}</h2>
<p>{item.description}</p>
</div>
);
}
export default ItemDetail;
設計のメリット
- 動的データの処理: ユーザーやアプリケーションの状態に応じたコンテンツを提供できます。
- URL駆動型のナビゲーション: URLに基づいた状態管理が容易になります。
- スケーラビリティ: 多数の動的ページを効率的にサポート可能です。
次のセクションでは、UI/UXを向上させるネストレイアウトのデザイン術について解説します。
UI/UXを向上させるネストレイアウトのデザイン術
ReactでOutletを使ったネストレイアウトを構築する際、デザインに工夫を加えることで、使いやすく魅力的なインターフェースを作成できます。このセクションでは、ユーザー体験を向上させるための具体的なデザインテクニックを紹介します。
レスポンシブデザインの実装
ネストレイアウトでは、異なるデバイスサイズに対応するレスポンシブデザインが重要です。親コンポーネントで基本的なCSSグリッドやフレックスボックスを使って、コンテンツが自然に拡張・縮小するように設計します。
例: CSSグリッドを使用したレイアウト
.layout {
display: grid;
grid-template-rows: auto 1fr auto;
height: 100vh;
}
header {
background: #333;
color: white;
padding: 1rem;
}
main {
padding: 1rem;
overflow-y: auto;
}
footer {
background: #333;
color: white;
padding: 1rem;
text-align: center;
}
function Layout() {
return (
<div className="layout">
<header>
<h1>Responsive Layout</h1>
</header>
<main>
<Outlet />
</main>
<footer>
<p>© 2024 My Website</p>
</footer>
</div>
);
}
視覚的な一貫性の確保
アプリ全体で色、フォント、スペーシングの一貫性を保つことが重要です。以下のツールや手法を活用します:
- テーマプロバイダー:
styled-components
やMUI
を使い、テーマをグローバルに適用する。 - CSS変数: カスタマイズ可能なスタイルを集中管理します。
例: CSS変数を使用したスタイル管理
:root {
--primary-color: #4caf50;
--secondary-color: #333;
--font-family: 'Arial, sans-serif';
}
body {
font-family: var(--font-family);
}
header {
background-color: var(--primary-color);
}
footer {
background-color: var(--secondary-color);
color: white;
}
ナビゲーションの工夫
ネストレイアウトでは、ユーザーが迷わずに目的のコンテンツへアクセスできるナビゲーション設計が不可欠です。以下の機能を取り入れましょう:
- 現在のページを視覚的に強調: 現在アクティブなリンクを目立たせるデザインにします。
- パンくずリストの導入: 階層的なルート構造をわかりやすく表示します。
例: アクティブなリンクの強調
import { NavLink } from 'react-router-dom';
function Navigation() {
return (
<nav>
<NavLink
to="/home"
style={({ isActive }) => ({ color: isActive ? 'red' : 'black' })}
>
Home
</NavLink>
|
<NavLink
to="/about"
style={({ isActive }) => ({ color: isActive ? 'red' : 'black' })}
>
About
</NavLink>
</nav>
);
}
例: パンくずリストの実装
import { useLocation, Link } from 'react-router-dom';
function Breadcrumbs() {
const location = useLocation();
const pathnames = location.pathname.split('/').filter(Boolean);
return (
<nav>
{pathnames.map((value, index) => {
const to = `/${pathnames.slice(0, index + 1).join('/')}`;
return (
<span key={to}>
<Link to={to}>{value}</Link> {index < pathnames.length - 1 && ' > '}
</span>
);
})}
</nav>
);
}
アニメーションとトランジションの追加
ページ遷移時にアニメーションを加えることで、洗練された体験を提供できます。React Transition Group
やFramer Motion
を使ってスムーズなトランジションを実現します。
例: フェードイン/アウトのアニメーション
import { CSSTransition, TransitionGroup } from 'react-transition-group';
import './styles.css';
function AnimatedOutlet({ children }) {
return (
<TransitionGroup>
<CSSTransition key={location.key} classNames="fade" timeout={300}>
{children}
</CSSTransition>
</TransitionGroup>
);
}
.fade-enter {
opacity: 0;
}
.fade-enter-active {
opacity: 1;
transition: opacity 300ms;
}
.fade-exit {
opacity: 1;
}
.fade-exit-active {
opacity: 0;
transition: opacity 300ms;
}
まとめ
- レスポンシブデザインでデバイスに適応。
- 視覚的な一貫性と直感的なナビゲーションを提供。
- アニメーションで洗練されたユーザー体験を作る。
次のセクションでは、Outletを使ったブログアプリの具体的な構築例を紹介します。
実践例: Outletを使ったブログアプリの構築
Outletを活用することで、ブログアプリのようなネストされたルーティングが必要なアプリケーションを簡単に構築できます。このセクションでは、親ルートに共通のレイアウトを配置し、子ルートで個別の記事を表示するブログアプリを実装します。
プロジェクトの準備
ブログアプリを作成するには、以下の構成を用います。
- 親コンポーネント: レイアウトやナビゲーションを管理。
- 子コンポーネント: 記事一覧や記事詳細を表示。
必要なライブラリのインストール
npx create-react-app blog-app
cd blog-app
npm install react-router-dom
親コンポーネントの実装
以下のコードは、親コンポーネントで共通レイアウトとナビゲーションを設定します。
import { Outlet, Link } from 'react-router-dom';
function BlogLayout() {
return (
<div className="layout">
<header>
<h1>My Blog</h1>
<nav>
<Link to="/posts">All Posts</Link>
</nav>
</header>
<main>
<Outlet />
</main>
<footer>© 2024 My Blog</footer>
</div>
);
}
export default BlogLayout;
記事一覧ページの実装
記事一覧ページでは、サンプルデータをループして記事のリストを表示します。
import { Link } from 'react-router-dom';
const posts = [
{ id: 1, title: "Understanding React Router" },
{ id: 2, title: "React State Management Tips" },
{ id: 3, title: "Using Hooks Effectively" },
];
function PostList() {
return (
<div>
<h2>All Posts</h2>
<ul>
{posts.map(post => (
<li key={post.id}>
<Link to={`/posts/${post.id}`}>{post.title}</Link>
</li>
))}
</ul>
</div>
);
}
export default PostList;
記事詳細ページの実装
URLパラメータを使用して、特定の記事を動的に表示します。
import { useParams } from 'react-router-dom';
const posts = [
{ id: 1, title: "Understanding React Router", content: "This is a guide to React Router..." },
{ id: 2, title: "React State Management Tips", content: "State management in React can be tricky..." },
{ id: 3, title: "Using Hooks Effectively", content: "Hooks are a powerful feature in React..." },
];
function PostDetail() {
const { id } = useParams();
const post = posts.find(p => p.id === parseInt(id));
if (!post) {
return <p>Post not found!</p>;
}
return (
<div>
<h2>{post.title}</h2>
<p>{post.content}</p>
</div>
);
}
export default PostDetail;
ルート構造の設定
親ルートにBlogLayout
を、子ルートにPostList
とPostDetail
を設定します。
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import BlogLayout from './BlogLayout';
import PostList from './PostList';
import PostDetail from './PostDetail';
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<BlogLayout />}>
<Route path="posts" element={<PostList />} />
<Route path="posts/:id" element={<PostDetail />} />
</Route>
</Routes>
</Router>
);
}
export default App;
動作確認
- アプリを起動して
/posts
にアクセスすると、記事の一覧が表示されます。 - 各記事リンクをクリックすると、記事の詳細が表示されます。
- 親コンポーネントの共通レイアウト(ヘッダー、フッター)が常に維持されます。
拡張アイデア
- API連携: ローカルデータではなく、外部APIから記事データを取得する。
- 検索機能: 記事をタイトルで検索可能にする。
- ページネーション: 記事一覧にページネーションを追加。
このブログアプリをベースに、より高度な機能を実装することで、柔軟でスケーラブルなアプリケーションを構築できます。次のセクションでは、Outletを使ったレイアウトで発生しやすい問題とその解決法を解説します。
トラブルシューティング: よくある問題とその解決法
Outletを使ったネストレイアウトを構築する際、開発者が直面する可能性のある一般的な問題とその解決策を紹介します。これらのトラブルシューティング方法を知ることで、スムーズな開発が可能になります。
1. 子ルートが表示されない
問題の症状: 親ルートは表示されるが、子ルートのコンテンツが<Outlet />
にレンダリングされない。
原因: 子ルートが正しく定義されていない、または親ルートに<Outlet />
がない。
解決策:
- 親ルートで
<Outlet />
が使用されていることを確認します。 - 子ルートが正しいパスで定義されているか確認します。
- 以下のように親子関係を明確に設定してください。
<Route path="/" element={<Parent />}>
<Route path="child" element={<Child />} />
</Route>
2. URLが正しいのに「ページが見つかりません」エラーが表示される
問題の症状: 子ルートが存在するにもかかわらず404エラーが発生する。
原因: ルート設定が正しくない、またはブラウザのリロードで問題が発生している。
解決策:
- React Routerの設定を確認:
BrowserRouter
を使用している場合、サーバーがルートを認識していないことがあります。この場合、サーバー側でルートをすべてindex.html
にリダイレクトする設定を行います。 例:Node.js
サーバーのリダイレクト設定
app.use((req, res) => {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
3. 動的ルートのパラメータが取得できない
問題の症状: useParams
を使用しても、URLパラメータが取得できない。
原因: 動的ルートのパスが正しく設定されていない。
解決策:
- 子ルートに動的パスを正しく設定します。例:
<Route path="posts/:id" element={<PostDetail />} />
useParams
を正しく利用しているか確認します。
const { id } = useParams();
4. コンテンツが正しくスタイリングされない
問題の症状: 子ルートのコンテンツが親コンポーネントのスタイルに干渉している、または崩れて表示される。
原因: 親コンポーネントのCSSが子コンポーネントに意図せず適用されている。
解決策:
- CSSモジュールや
styled-components
を使用してスタイルをコンポーネントスコープに限定します。
/* Example.module.css */
.header {
background-color: #333;
color: white;
}
import styles from './Example.module.css';
<header className={styles.header}>Header</header>
5. 子コンポーネントで`useEffect`が何度も呼び出される
問題の症状: 子ルートに切り替えるたびにuseEffect
が再実行される。
原因: 子ルートが親コンポーネントによって再レンダリングされている。
解決策:
- 親コンポーネントが不要に再レンダリングされないよう、Reactの
React.memo
やuseMemo
を活用します。
import React, { memo } from 'react';
const Child = memo(() => {
return <div>Child Component</div>;
});
export default Child;
6. SEO対策が不十分
問題の症状: ネストレイアウトが適切に動作していても、クローラーがコンテンツを正しくインデックスしない。
原因: React Routerでのクライアントサイドレンダリングが原因で、初期ロード時にコンテンツがないと判断される。
解決策:
- サーバーサイドレンダリング(SSR)を導入する。
- または、
react-snap
やreact-meta-tags
を活用して基本的なメタ情報を設定します。
import { Helmet } from 'react-helmet';
function Page() {
return (
<Helmet>
<title>My Blog</title>
<meta name="description" content="This is a blog page" />
</Helmet>
);
}
まとめ
トラブルシューティングを行うことで、React RouterとOutletを利用したネストレイアウトの構築がスムーズになります。問題の発生原因を的確に特定し、適切な修正を加えることで、開発効率とアプリの信頼性を向上させることができます。
まとめ
本記事では、ReactのOutletコンポーネントを活用したネストされたレイアウトの構築方法について、基本概念から実践例、トラブルシューティングまで幅広く解説しました。親子コンポーネントを利用して共通レイアウトと個別のコンテンツを効率的に管理できるOutletは、React Routerの中でも非常に強力なツールです。
また、動的ルートの実装やUI/UXを向上させるデザイン術、ブログアプリの構築例を通じて、Outletの実用的な使い方を学びました。トラブルシューティングの知識を活用することで、予期しない問題にも柔軟に対応できます。
Outletを使いこなすことで、再利用性が高く保守性に優れたモダンなReactアプリケーションを構築できるでしょう。この技術を活かして、より魅力的でユーザーに優しいアプリを開発してください。
コメント