React Fundamentals

Components

function Hello() {
    return <h1>Hello from a component!</h1>;
}

export default Hello

コンポーネントの使用(しよう) :

import Hello from "./components/Hello";

function App() {
  return (
    <>
      <Hello />
    </>
  )
}

React.memo

  • 用途(ようと) : 関数(かんすう) コンポーネントをラップして、props が変更(へんこう) されていない場合(ばあい)不要(ふよう)(さい) レンダリングを防止(ぼうし)
const MyComponent = React.memo((props) => {
    return <div>{props.value}</div>;
});

Use Case: 関数(かんすう) コンポーネントがあり、特定(とくてい)状況(じょうきょう) で props が変更(へんこう) されないことが確実(かくじつ)場合(ばあい) 、レンダリングパフォーマンスを最適化(さいてきか) するために使用(しよう)

Props

コンポーネント(かん)共有(きょうゆう) される()()専用(せんよう) のプロパティ。
(おや) コンポーネントから() コンポーネントにデータを(わた) すことができる。
<Component key=value />
// App.jsx
function App() {
  return (
    <>
      <Hello name="ABC" msg="Here" emoji="💥" />
      <Hello name="XYZ" msg="Nothing" emoji="🎇" />
    </>
  );
}

// Hello.jsx
function Hello({ name, msg, emoji }) {
  return (
    <div>
      <h1>
        Hello {name}, {msg} {emoji}
      </h1>
    </div>
  );
}

Immutability

不変性(ふへんせい)

function Hello(props) {
  // props.name = "Replace"; // Error: Uncaught TypeError: "name" is read-only
  return (
    <div>
      <h1>
        Hello {props.name}, {props.msg} {props.emoji}!
      </h1>
    </div>
  );
}

PropTypes

(わた) される(あたい)(ただ) しいデータ(がた)() つことを保証(ほしょう) するメカニズム。

age: PropTypes.number

Lists & Keys

export default function Fruits() {
  const fruits = ["Apple", "Mango", "Orange", "Banana", "Pineapple"];
  return (
    <div>
      <ul>
        {fruits.map((fruit) => (
          <li key={fruit}>{fruit}</li>  // 正確: ユニークな key を追加
        ))}
      </ul>
    </div>
  );
}

Portal

  1. Modal/Dialog (ダイアログ)

    • 確認(かくにん) ダイアログ
    • メッセージ通知(つうち)
    • フォーム入力(にゅうりょく)
  2. フローティング要素(ようそ)

    • Tooltip (ツールチップ)
    • Dropdown Menu (ドロップダウンメニュー)
    • Select ドロップダウン
    • DatePicker (日付(ひづけ) 選択(せんたく) )
  3. グローバル通知(つうち)

    • Toast 通知(つうち)
    • エラーメッセージ
    • Loading 状態(じょうたい)
  4. 特殊(とくしゅ) UI

    • (みぎ) クリックメニュー (Context Menu)
    • 仮想(かそう) キーボード
    • 画像(がぞう) プレビュー
    • 動画(どうが) プレーヤー
    • ドラッグメニュー
  5. 特殊(とくしゅ) シナリオ

    • iframe (ない)要素(ようそ)
    • Shadow DOM (そと)要素(ようそ)
    • サードパーティパッケージの統合(とうごう)

使用(しよう) タイミング:

  • 現在(げんざい) の DOM 階層(かいそう) 制限(せいげん) から()()必要(ひつよう) がある場合(ばあい)
  • z-index/overflow 問題(もんだい)回避(かいひ) する場合(ばあい)
  • グローバル UI コンポーネントを共有(きょうゆう) する必要(ひつよう) がある場合(ばあい)
  • (こと) なるフレームワークのコンポーネントを統合(とうごう) する必要(ひつよう) がある場合(ばあい)

Hooks

useState

状態(じょうたい) 変数(へんすう) と setter 関数(かんすう)作成(さくせい) し、仮想(かそう) DOM (ない)(あたい)更新(こうしん) するために使用(しよう)
import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}
  • Native (() の JS との比較(ひかく) )
<p id="count">Count: 0</p>
<button id="increment">Increment</button>
<script>
  let count = 0;
  document.getElementById('increment').addEventListener('click', function() {
    count++;
    document.getElementById('count').textContent = 'Count: ' + count;
  });
</script>

useEffect

  • 用途(ようと)

    • イベントリスナー (Event Listeners)
    • DOM 操作(そうさ)
    • サブスクリプション (Subscriptions、リアルタイム更新(こうしん) など)
    • API からデータを取得(しゅとく)
    • コンポーネントのアンマウント() のクリーンアップ作業(さぎょう)
  • React にいつコードを実行(じっこう) するかを指示(しじ)

    • コンポーネントが(さい) レンダリングされた(とき)
    • コンポーネントがマウントされた(とき)
    • 特定(とくてい)(あたい)状態(じょうたい)変更(へんこう) された(とき)
useEffect(() => {})           // 毎回レンダリング後に実行
useEffect(() => {}, [])       // マウント時に一度だけ実行
useEffect(() => {}, [value])  // マウント時 + value が変更された時に実行
function DataFetcher() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => setData(data));
  }, []); // 空配列はコンポーネントのマウント時に一度だけ実行を意味
  return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>;
}

useRef

(あたい)変更(へんこう) されても(さい) レンダリングを()() こさない。
コンポーネントに情報(じょうほう)記憶(きおく) させたいが、その情報(じょうほう)(あたら) しいレンダリングをトリガーしないようにしたい場合(ばあい)使用(しよう)
  • Use Cases
    • DOM 要素(ようそ) へのアクセス / 操作(そうさ)
    • フォーカス (Focus)、アニメーション、トランジションの処理(しょり)
    • タイマー (Timers) とインターバル (Intervals) の管理(かんり)
function FocusInput() {
  const inputRef = useRef(null);

  const focusInput = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} />
      <button onClick={focusInput}>Focus Input</button>
    </div>
  );
}

useContext

複数(ふくすう) のコンポーネント階層(かいそう) (かん)(あたい)共有(きょうゆう) でき、(かく) 階層(かいそう)手動(しゅどう) で props を(わた)必要(ひつよう) がない。
  • 使用(しよう) シナリオ
    • グローバル状態(じょうたい) (テーマ、言語(げんご) 切替(きりかえ) など)
    • (こと) なる階層(かいそう) のコンポーネント(かん) のデータ伝達(でんたつ)

Provider

// Context を作成し値を提供

Consumer

// Context 内の値を使用

useMemo

  • 用途(ようと) :
    • パフォーマンス最適化(さいてきか)不要(ふよう)重複(じゅうふく) 計算(けいさん)回避(かいひ)
    • **「計算(けいさん) 結果(けっか) 」**をキャッシュ
  • 使用(しよう) シナリオ:
    • (さい) レンダリング(ちゅう)高負荷(こうふか)計算(けいさん)実行(じっこう)回避(かいひ)
    • 大規模(だいきぼ) データリストのレンダリングを最適化(さいてきか)
const memoizedValue = useMemo(() => {
    return complexCalculation(a, b); // 計算結果をキャッシュ
}, [a, b]);

useCallback

  • 用途(ようと) :
    • パフォーマンス最適化(さいてきか)不要(ふよう)関数(かんすう)(さい) 作成(さくせい)回避(かいひ)
    • **「関数(かんすう) 自体(じたい) 」**をキャッシュ
  • 使用(しよう) シナリオ:
    • 関数(かんすう)props として() コンポーネントに(わた)必要(ひつよう) がある場合(ばあい) (React.memo と併用(へいよう) )
    • 関数(かんすう) 参照(さんしょう)安定(あんてい) させ、() コンポーネントの不要(ふよう)(さい) レンダリングを防止(ぼうし)
const memoizedCallback = useCallback(() => {
    doSomething(a, b); // 関数参照をキャッシュ
}, [a, b]);

useReducer

  • 用途(ようと) : 複雑(ふくざつ)状態(じょうたい) ロジックを管理(かんり)
  • 使用(しよう) シナリオ:
    • マルチステップフォーム
    • 画像(がぞう) ドラッグ機能(きのう)
    • 複雑(ふくざつ)状態(じょうたい) 切替(きりかえ) ロジック (Redux に類似(るいじ) )

useImperativeHandle

  • 用途(ようと) : (おや) コンポーネントがアクセスできる() コンポーネントのインスタンス() をカスタマイズ。
  • 使用(しよう) シナリオ:
    • () コンポーネントの内部(ないぶ) 実装(じっそう)(かく) し、特定(とくてい) のメソッドのみを公開(こうかい) (手動(しゅどう)() コンポーネントのアニメーションをトリガーするなど)
    • 複雑(ふくざつ)操作(そうさ) 可能(かのう) なコンポーネント (カスタムポップアップ操作(そうさ) など)

useLayoutEffect

  • 用途(ようと) : DOM 更新後(こうしんご) 、ブラウザが描画(びょうが) する(まえ)同期的(どうきてき)実行(じっこう)
  • 使用(しよう) シナリオ:
    • DOM レンダリング()即座(そくざ)測定(そくてい) または修正(しゅうせい)(おこな)必要(ひつよう) がある場合(ばあい)
    • 複雑(ふくざつ)同期(どうき) アニメーションやレイアウトロジックの実装(じっそう)

useId

  • 用途(ようと) : ユニークで安定(あんてい) した ID を生成(せいせい)
  • 使用(しよう) シナリオ:
    • 複数(ふくすう) 要素(ようそ) のユニークな Key ()生成(せいせい)
    • フォームラベルと入力(にゅうりょく) フィールドのアクセシビリティを関連(かんれん) ()

useTransition

  • 用途(ようと) : ノンブロッキングの過渡的(かとてき) な UI 更新(こうしん)管理(かんり)
  • 使用(しよう) シナリオ:
    • ページ切替時(きりかえじ)過渡(かと) 状態(じょうたい)表示(ひょうじ)
    • 高頻度(こうひんど) 計算(けいさん) 結果(けっか)遅延(ちえん) レンダリングを最適化(さいてきか)

useDeferredValue

  • 用途(ようと) : (あたい)更新(こうしん)遅延(ちえん) させ、パフォーマンスを向上(こうじょう)
  • 使用(しよう) シナリオ:
    • 高速(こうそく) 入力時(にゅうりょくじ) の UI のカクつきを回避(かいひ)
    • (こう) パフォーマンスな検索(けんさく) 入力(にゅうりょく) ボックス

useSyncExternalStore

  • 用途(ようと) : 外部(がいぶ) データソースをサブスクライブし、データの同期(どうき)維持(いじ)
  • 使用(しよう) シナリオ:
    • カスタムグローバル状態(じょうたい) 管理(かんり) ツール
    • サードパーティデータベースへの接続(せつぞく) (Redux など)

useInsertionEffect

  • 用途(ようと) : DOM 変更前(へんこうまえ) に CSS スタイルを注入(ちゅうにゅう)
  • 使用(しよう) シナリオ:
    • 動的(どうてき) なスタイル挿入(そうにゅう) (Emotion や styled-components など)

学習(がくしゅう) 順序(じゅんじょ) (Orders)

  1. 初心者(しょしんしゃ) : (もっと)使用(しよう) される Hooks を習得(しゅうとく)

    • useState
    • useEffect
    • useContext
  2. 中級(ちゅうきゅう) : パフォーマンス最適化(さいてきか) 関連(かんれん) の Hooks を学習(がくしゅう)

    • useMemo
    • useCallback
    • useRef
  3. 上級(じょうきゅう) : 複雑(ふくざつ)状態(じょうたい) とロジックを処理(しょり) する Hooks

    • useReducer
    • useImperativeHandle
  4. 特定(とくてい) 用途(ようと) : 特殊(とくしゅ) なシナリオに対応(たいおう) する Hooks を学習(がくしゅう)

    • useLayoutEffect
    • useTransition
    • useDeferredValue
    • useSyncExternalStore
    • useInsertionEffect
    • useId
  • useStateuseReducer はコンポーネント内部(ないぶ)状態(じょうたい) 管理(かんり)使用(しよう)
  • useEffect, useLayoutEffect, useInsertionEffect はすべて副作用(ふくさよう) 処理(しょり)使用(しよう) され、(ちが) いは実行(じっこう) タイミング。
  • useContext はコンポーネント(かん) でデータを共有(きょうゆう) するために使用(しよう)
  • useRefuseId参照(さんしょう) とユニーク ID の管理(かんり)使用(しよう)
  • useTransitionuseDeferredValue はパフォーマンス最適化(さいてきか)使用(しよう) され、不要(ふよう) な UI ブロッキングを軽減(けいげん)
  • useSyncExternalStore外部(がいぶ) (() React) の状態(じょうたい) をサブスクライブするために使用(しよう)

Purity

React コンポーネントは純粋(じゅんすい) 関数(かんすう) であるべき:

function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}
  • Native (() の JS との比較(ひかく) )
<h1 id="greeting"></h1>
<script>
  let name = 'Alice';
  document.getElementById('greeting').textContent = 'Hello, ' + name + '!';
</script>

Strict Mode

import React from 'react';

function MyApp() {
  return (
    <React.StrictMode>
      <App />
    </React.StrictMode>
  );
}

特性(とくせい) 説明(せつめい)

  • 開発(かいはつ) モードでは、特定(とくてい) のライフサイクルが2(かい) 実行(じっこう) される
  • 副作用(ふくさよう)純粋(じゅんすい) かどうかを確認(かくにん) するのに役立(やくだ)
  • 非推奨(ひすいしょう) の API 使用(しよう)安全(あんぜん) でないライフサイクルを識別(しきべつ)

Fragments

function List() {
  return (
    <>
      <li>Item 1</li>
      <li>Item 2</li>
    </>
  );
}

Context API

const ThemeContext = createContext();

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');
  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

function ThemedComponent() {
  const { theme, setTheme } = useContext(ThemeContext);
  return (
    <div>
      <p>Current Theme: {theme}</p>
      <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
        Toggle Theme
      </button>
    </div>
  );
}

Portals

function Modal() {
  return ReactDOM.createPortal(
    <div className="modal">This is a modal</div>,
    document.getElementById('modal-root')
  );
}

Error Boundaries

class ErrorBoundary extends React.Component {
  state = { hasError: false };

  static getDerivedStateFromError() {
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    console.error(error, info);
  }

  render() {
    if (this.state.hasError) {
      return <h1>Something went wrong.</h1>;
    }
    return this.props.children;
  }
}

Suspense

import { Suspense, lazy } from 'react';

const LazyComponent = lazy(() => import('./LazyComponent'));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}

Event Handlers

(おも)input, textarea, select, radio などのフォーム要素(ようそ)使用(しよう)
入力値(にゅうりょくち)変更(へんこう) されるたびに関数(かんすう) をトリガー

Mouse Events

  • onClick
  • onDoubleClick
  • onMouseDown
  • onMouseUp
  • onMouseMove
  • onMouseEnter
  • onMouseLeave
  • onMouseOver
  • onMouseOut
  • onContextMenu

Form Events

  • onChange
  • onSubmit
  • onReset
  • onInvalid
  • onSelect

Focus Events

  • onFocus
  • onBlur

Keyboard Events

  • onKeyDown
  • onKeyUp
  • onKeyPress

Clipboard Events

  • onCopy
  • onCut
  • onPaste

Touch Events

  • onTouchStart
  • onTouchMove
  • onTouchEnd
  • onTouchCancel

Drag & Drop Events

  • onDrag
  • onDragStart
  • onDragEnd
  • onDragEnter
  • onDragLeave
  • onDragOver
  • onDrop

Media Events

  • onPlay
  • onPause
  • onPlaying
  • onEnded
  • onLoadStart
  • onLoadedData
  • onLoadedMetadata
  • onError
  • onVolumeChange
  • onTimeUpdate
  • onSeeking
  • onSeeked

Animation Events

  • onAnimationStart
  • onAnimationEnd
  • onAnimationIteration

Transition Events

  • onTransitionEnd
  • onTransitionStart

Scroll Events

  • onScroll
  • onWheel

Window Events

  • onResize
  • onError
  • onLoad
  • onUnload
  • onBeforeUnload

Visibility Events

  • onVisibilityChange

Image Events

  • onLoad
  • onError

OnChange

function TextInput() {
  const [value, setValue] = useState('');

  function handleChange(e) {
    setValue(e.target.value);
  }

  return <input value={value} onChange={handleChange} />;
}

React Query

  • Server Side データ処理(しょり)特化(とっか)
    • API リクエスト
    • データキャッシュ
    • データ同期(どうき)
    • エラーリトライ
    • 状態(じょうたい) 更新(こうしん)

Tanstack Router

zustand

  • useShallow
    • サブスクライブされた state を(あさ)比較(ひかく) し、不要(ふよう)(さい) レンダリングを削減(さくげん)
    • オブジェクトや配列(はいれつ) (がた) の state に(とく)有効(ゆうこう)
    • React.memo の比較(ひかく) ロジックに類似(るいじ)

Middleware

immer

  • 可変(かへん)方法(ほうほう)不変(ふへん)更新(こうしん)() くことを許可(きょか)
  • 複雑(ふくざつ)状態(じょうたい)更新(こうしん) ロジックを簡素化(かんそか)
  • 不変性(ふへんせい) (Immutability) を自動(じどう) 処理(しょり)

subscribeWithSelector

  • 特定(とくてい)state 変更(へんこう)監視(かんし) 指定(してい) / 特定(とくてい) 条件(じょうけん) でサブスクリプションをトリガー可能(かのう)

devtools

  • Redux DevTools との統合(とうごう)
  • タイムトラベルデバッグをサポート
  • 状態(じょうたい) 変更(へんこう)履歴(りれき)確認(かくにん) 可能(かのう)

persist

  • 状態(じょうたい)永続化(えいぞくか) 機能(きのう)提供(ていきょう)
  • ストレージエンジンをカスタマイズ可能(かのう)
  • 暗号化(あんごうか)圧縮(あっしゅく) をサポート

App.jsx
test.jsx