React コンポーネント間通信:Redux と MobX で大規模アプリケーションを制覇

2024-04-02

React コンポーネント間の通信方法

props

概要

親コンポーネントから子コンポーネントへデータを渡す最も基本的な方法です。props は、子コンポーネントに渡されるオブジェクトで、コンポーネントの属性として指定されます。

メリット

  • シンプルで分かりやすい
  • 軽量で効率的
  • 一方向にしかデータを渡せない
  • 親子関係にしか適用できない

// 親コンポーネント
const Parent = () => {
  const data = "Hello, world!";
  return (
    <Child data={data} />
  );
};

// 子コンポーネント
const Child = ({ data }) => {
  return (
    <div>{data}</div>
  );
};

state

コンポーネント内部でデータを保持し、更新することができます。state は、コンポーネントの内部状態を表すオブジェクトで、useState フックを使用して初期化されます。

  • コンポーネント内部でデータを管理できる
  • 複雑なデータ構造には不向き
  • 大規模なアプリケーションでは管理が難しくなる
const App = () => {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <h1>カウント: {count}</h1>
      <button onClick={handleClick}>+</button>
    </div>
  );
};

context

複数のコンポーネント間でデータを共有するための仕組みです。context は、コンポーネントツリー全体で共有できる値を提供します。

  • 親子関係に縛られない
  • 複雑になりやすい
  • 不要なコンポーネントも再レンダリングされる
// context を作成
const ThemeContext = createContext();

// context を提供するコンポーネント
const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState("light");

  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

// context を使用するコンポーネント
const MyComponent = () => {
  const { theme } = useContext(ThemeContext);

  return (
    <div style={{ color: theme }}>
      <h1>テーマ: {theme}</h1>
    </div>
  );
};

イベント

コンポーネント間でイベントを発生させ、それを受け取ることで通信することができます。イベントは、コンポーネント間の双方向通信を実現する手段です。

  • 柔軟性が高い
  • ユーザー操作に合わせた通信が可能
  • コード量が増える
  • イベントの種類が増えると管理が難しくなる
// 親コンポーネント
const Parent = () => {
  const handleClick = () => {
    console.log("親コンポーネントでクリックされました");
  };

  return (
    <div>
      <button onClick={handleClick}>ボタン</button>
      <Child onClick={handleClick} />
    </div>
  );
};

// 子コンポーネント
const Child = ({ onClick }) => {
  return (
    <div>
      <button onClick={onClick}>子コンポーネントでクリックされました</button>
    </div>
  );
};

その他のライブラリ

Redux や MobX などのライブラリを使用することで、より複雑なデータ管理やコンポーネント間の通信を実現することができます。

  • 複雑なコンポーネント間の通信を簡略化できる
  • 学習コストが高い
  • アプリケーションによっては不要な場合がある
// Redux を使用した例

const store = createStore(reducer);

const App = () => {
  const count = useSelector((state) => state.count);
  const dispatch = useDispatch();

  const handleClick =



props

// 親コンポーネント
const Parent = () => {
  const data = "Hello, world!";
  return (
    <Child data={data} />
  );
};

// 子コンポーネント
const Child = ({ data }) => {
  return (
    <div>{data}</div>
  );
};

state

const App = () => {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <h1>カウント: {count}</h1>
      <button onClick={handleClick}>+</button>
    </div>
  );
};

context

// context を作成
const ThemeContext = createContext();

// context を提供するコンポーネント
const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState("light");

  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

// context を使用するコンポーネント
const MyComponent = () => {
  const { theme } = useContext(ThemeContext);

  return (
    <div style={{ color: theme }}>
      <h1>テーマ: {theme}</h1>
    </div>
  );
};

イベント

// 親コンポーネント
const Parent = () => {
  const handleClick = () => {
    console.log("親コンポーネントでクリックされました");
  };

  return (
    <div>
      <button onClick={handleClick}>ボタン</button>
      <Child onClick={handleClick} />
    </div>
  );
};

// 子コンポーネント
const Child = ({ onClick }) => {
  return (
    <div>
      <button onClick={onClick}>子コンポーネントでクリックされました</button>
    </div>
  );
};

その他のライブラリ

// store を作成
const store = createStore(reducer);

const App = () => {
  const count = useSelector((state) => state.count);
  const dispatch = useDispatch();

  const handleClick = () => {
    dispatch({ type: "INCREMENT" });
  };

  return (
    <div>
      <h1>カウント: {count}</h1>
      <button onClick={handleClick}>+</button>
    </div>
  );
};

React コンポーネント間の通信には、props、state、context、イベント、その他のライブラリなど、さまざまな方法があります。それぞれの方法にはメリットとデメリットがあり、状況によって使い分けることが重要です。

上記サンプルコードを参考に、それぞれの方法を理解し、適切な方法でコンポーネント間の通信を実装してください。




その他のコンポーネント間通信方法

refs を使用して、コンポーネント間の直接的な参照を作成することができます。これは、親コンポーネントが子コンポーネントのメソッドやプロパティに直接アクセスしたい場合に便利です。

// 親コンポーネント
const Parent = () => {
  const childRef = useRef();

  const handleClick = () => {
    childRef.current.focus();
  };

  return (
    <div>
      <button onClick={handleClick}>子コンポーネントにフォーカス</button>
      <Child ref={childRef} />
    </div>
  );
};

// 子コンポーネント
const Child = ({ ref }) => {
  return (
    <input ref={ref} />
  );
};

高階コンポーネント (HOC)

HOC を使用して、コンポーネントに共通の機能を追加することができます。これは、複数のコンポーネントで同じような処理を行う必要がある場合に便利です。

const withAuth = (Component) => {
  return (props) => {
    const { isLoggedIn } = useContext(AuthContext);

    if (!isLoggedIn) {
      return <Redirect to="/login" />;
    }

    return <Component {...props} />;
  };
};

const MyComponent = () => {
  return (
    <div>
      <h1>秘密のページ</h1>
    </div>
  );
};

const Auth

javascript reactjs


JSON.stringify()を使いこなす:詳細ガイド

JSON. stringify()は、JSONオブジェクトを文字列に変換する関数です。オプションでスペースやタブを指定することで、整形された文字列を出力できます。上記のコードは、JSONオブジェクトを2スペースのインデントで整形して出力します。...


ReactJS で dangerouslySetInnerHTML を使用して改行なしスペースをレンダリングする方法

ReactJS では、&nbsp; エンティティまたは React. createElement('span', { dangerouslySetInnerHTML: { __html: ' ' }}) を使用して、改行なしスペースをレンダリングすることができます。...


Reactパフォーマンス向上に必須!「key」プロパティの使い方

propsオブジェクトを使用するコンポーネントに「key」プロパティを渡すには、親コンポーネントからpropsオブジェクトとして渡します。例えば、以下のコードのようにListItemコンポーネントにidプロパティを渡します。親コンポーネントでListItemコンポーネントを使用する場合は、以下のようになります。...


React で再利用可能なラップコンポーネントを作成:カスタムフックを使ったスマートな方法

React コンポーネントを条件付きでラップするには、いくつかの方法があります。最も一般的な方法は次の 3 つです。三項演算子を使用するこれは、最も簡潔でわかりやすい方法です。次のようなコードになります。このコードでは、isLoggedIn プロップが true の場合、Wrapper コンポーネントで子コンポーネントをラップします。そうでない場合は、Default コンポーネントでラップします。...


ngx-cookie-service、ng2-cookies、cookie-js:Angular でクッキーを管理するためのライブラリ

クッキーは、ブラウザと Web サーバー間でやり取りされる小さなテキストファイルです。これらのファイルには、名前と値のペアが含まれており、Web サーバーは、ユーザーが以前にサイトにアクセスしたかどうかを判断したり、ユーザー設定を保存したりするために使用することができます。...


SQL SQL SQL SQL Amazon で見る



React.jsコンポーネントをラップする3つの方法:高階コンポーネント、Render Props、フック

React. jsでコンポーネントを別のコンポーネントでラップする方法は、コンポーネントの再利用性とコードの保守性を向上させるために役立ちます。この手法は、様々な状況で活用できます。高階コンポーネント(HOC)は、既存のコンポーネントに機能を追加するためのラッパーコンポーネントです。HOCは、以下のような共通の機能を抽象化するために使用できます。


React.jsで子コンポーネントから親コンポーネントへpropsを渡す方法

子コンポーネントから親コンポーネントへpropsを渡すには、以下の2つの方法があります。propsオブジェクトを渡す子コンポーネント内で、propsオブジェクトに渡したいデータをプロパティとして追加します。上記のコードでは、ChildComponent内でprops


redux-thunk vs redux-promise:Reduxで非同期処理を行うミドルウェアの比較

非同期処理とは、プログラムの実行が一時的に停止し、別の処理が実行される処理のことです。例えば、APIリクエストやファイル読み込みなどが非同期処理に該当します。Reduxは同期処理を前提として設計されているため、非同期処理を直接扱うにはいくつかの問題があります。