はじめに
Reactは現代のフロントエンド開発で定番で、HTMLやCSSではなくいきなりReactから学習し始めるケースも増えてきています。多くの企業でも活用されており、フロントエンドの募集ではReactの知識と実務経験を求めることも多いです。技術面接では、Reactに関する基本的な概念から実践的な応用方法まで問われることが珍しくありません。
本記事では、面接で頻出のの質問を10個厳選し、各項目ごとに解説と簡潔なコード例を交えながら丁寧に説明します。Reactを学び始めの方にも分かりやすく、なおかつ応用しやすい知識を身につけられるようにまとめています。
1. Reactの特徴と選ばれる理由
ReactはJSXや仮想DOM、コンポーネント指向で効率的なUI開発を可能にします。自由度の高さから、さまざまなツールやライブラリとの組み合わせも容易です。
コード例:Reactの基本的なコンポーネント構成
import React from 'react';
function App() {
return <h1>Hello, React!</h1>;
}
export default App;
JSXでHTMLのような記述ができるため、直感的なUI構築が可能です。
2. コンポーネントベースアーキテクチャとJSX
コンポーネントでUIを分割することで、再利用性・保守性が向上します。JSXはHTMLとJavaScriptを組み合わせて、ロジックを直接UIに反映しやすくします。
コード例:コンポーネント分割とJSX
function Button({ label }) {
return <button>{label}</button>;
}
function App() {
return (
<div>
<Button label="Click Me" />
</div>
);
}
<Button>
コンポーネントを使い回すことでUIパーツを統一的に管理します。
3. 仮想DOM(Virtual DOM)の仕組みとメリット
仮想DOMで差分計算を行い、実DOMの最小限更新を実現します。そのため高速かつスムーズなUIが得られます。
開発者は仮想DOMを直接扱う必要はなく、Reactが自動で最適化できる点がメリットです。
4. 状態管理(State)と一方向データフロー
state
はコンポーネント内部の状態を保持し、一方向データフローで状態変化に応じてUIを自動更新。データの流れが明確で、デバッグや保守が容易です。
コード例:stateを使ったカウンター
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>Count: {count}</button>;
}
状態更新でUIが自動的に最新化され、一方向データフローで混乱を回避できます。
5. Hooksの登場意義(クラスからの脱却)
Hooksにより、関数コンポーネントでも状態管理やライフサイクル相当の処理が可能です。クラスコンポーネントの複雑性を回避できます。
コード例:useStateで状態管理
// クラスを使わず、関数+useStateで状態を持てる
function Message() {
const [text, setText] = useState("Hello");
return <div onClick={() => setText("Hi!")}>{text}</div>;
}
Hooksで関数コンポーネントに柔軟性が追加され、コードがシンプルになります。
6. useState・useEffectフックの使いどころは?
useState
で状態を定義し、useEffect
で副作用(データ取得、イベント登録など)を管理します。実行タイミングを制御し、ロジックを分離できます。
コード例:useEffectでデータ取得
import React, { useState, useEffect } from 'react';
function DataFetcher() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('/api/data')
.then(res => res.json())
.then(json => setData(json));
}, []);
return <div>{data ? JSON.stringify(data) : "Loading..."}</div>;
}
useEffect
でマウント時にデータ取得し、useState
で取得データを管理します。
7. コンテキスト(Context)でProp Drilling解消
Contextでグローバルな情報を提供すれば、中間コンポーネントを介さず深い階層の子が直接データを取得可能です。「prop drilling」を防ぎ、コードをすっきり保てます。
コード例:Context使用例
import React, { createContext, useContext } from 'react';
const UserContext = createContext({ name: 'Alice' });
function UserName() {
const user = useContext(UserContext);
return <h2>{user.name}</h2>;
}
function App() {
return (
<UserContext.Provider value={{ name: "Bob" }}>
<UserName />
</UserContext.Provider>
);
}
UserName
はpropsを経由せず、Contextから直接ユーザー名を取得できます。
8. React RouterによるSPAナビゲーション
React Routerを使えば、ページリロードなしでURLに応じたコンポーネント切り替えが可能です。UX向上とコード構造化が容易になります。
コード例:React Router基本構成
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<nav>
<Link to="/">Home</Link>
<Link to="/about">About</Link>
</nav>
<Routes>
<Route path="/" element={<h1>Home Page</h1>} />
<Route path="/about" element={<h1>About Page</h1>} />
</Routes>
</BrowserRouter>
);
}
URLに応じたコンポーネント描画で、スムーズなSPA体験を実現できます。
9. パフォーマンス最適化(key属性、memo化)
key
属性でリスト要素を識別、React.memo
やuseMemo
で不要な再レンダリング回避できます。大規模アプリや大量データでも軽快な操作を維持可能です。
コード例:key属性とmemo化
import React, { memo } from 'react';
const ListItem = memo(({ item }) => <li>{item}</li>);
function ItemList({ items }) {
return <ul>{items.map(item => <ListItem key={item.id} item={item} />)}</ul>;
}
key
で差分レンダリングを最適化し、memo
で不要な再描画を削減できます。
10. カスタムフック(Custom Hooks)によるロジック再利用
カスタムフックで状態やロジックを関数として切り出し、複数コンポーネント間で再利用可能です。コードの重複削減と保守性向上に効果的。
コード例:カスタムフック
import { useState } from 'react';
function useInput(initialValue) {
const [value, setValue] = useState(initialValue);
return { value, onChange: e => setValue(e.target.value) };
}
function LoginForm() {
const username = useInput('');
const password = useInput('');
return (
<form>
<input type="text" {...username} placeholder="Username" />
<input type="password" {...password} placeholder="Password" />
</form>
);
}
共通ロジック(入力管理)をカスタムフック化して簡潔に再利用可能。
まとめ
以上の10個の質問は、技術面接でよく出るReact関連の質問です。
特に、下記の点について問題を紹介しました。
- なぜReactが業界標準として選ばれるのか
- コンポーネント・Hooks・Context・Routerを用いた柔軟な開発方法
- パフォーマンス最適化やコード再利用による保守性向上
これらの問題を練習しておくと、技術面接でのReact関連質問に対して自信を持って回答する足がかりができます。ここで示したコード例を参考に実際のプロジェクトで試してみると、より理解が深まり、本番の面接でも説得力ある説明ができるでしょう。
さらに面接突破率を上げるために、自身の回答を相手に伝える練習を積んでいきましょう。
コメントを残す