• はじめに この章では、Reactの高度な概念について深掘りします。GeekとGalがユーモラスで魅力的なやり取りで高度なトピックを理解しやすくしてくれるので、初心者から上級者まで楽しめます!
Gal Normal

Reactのスキルをレベルアップする準備はできてる?

Geek Curious

絶対に!どんな高度な概念を学ぶの?

Gal Happy

Higher-Order Components(HOCs)Render Props 、そして Context API をカバーするよ!HOCsから始めましょう!

  • Higher-Order Components(HOCs)
Gal Pleased

Higher-Order Components(高階コンポーネント)、略してHOCsは、コンポーネントを引数に取り、追加のプロップや振る舞いを持つ新しいコンポーネントを返す関数だよ。まるでコンポーネントにスーパーパワーを与えるみたい!💪

Geek Happy

おお、それはかっこいい!HOCを作成する方法は?

Gal Happy

簡単!コンポーネントを引数として取る関数を定義し、元のコンポーネントをラップする新しいコンポーネントを返すだけ。例を見てね:

function withSuperpowers(WrappedComponent) {
  return function EnhancedComponent(props) {
    const extraProp = 'I have superpowers!';
    return <WrappedComponent {...props} extraProp={extraProp} />;
  };
}
Geek Happy

わかった!HOCは、コンポーネントを取り、新しい強化されたコンポーネントを返す関数だね!

Gal Happy

その通り!さあ、 Render Props に進もう!

  • Render Props
Gal Pleased

Render Propsは、関数をコンポーネントのプロップとして渡し、その関数がJSXを返すというテクニックだよ。HOCを使わずにコンポーネント間でコードを共有する方法だね!

Geek Curious

おもしろい!例を見せてもらえる?

Gal Happy

もちろん!render propsを使ったコンポーネントの簡単な例を見てね:

function MouseTracker(props) {
  const [position, setPosition] = useState({ x: 0, y: 0 });

  const handleMouseMove = (event) => {
    setPosition({ x: event.clientX, y: event.clientY });
  };

  return (
    <div style={{ height: '100%' }} onMouseMove={handleMouseMove}>
      {props.render(position)}
    </div>
  );
}
Geek Happy

ああ、わかった!関数をプロップとして渡し、その関数がJSXをレンダリングする責任を持つんだね!

Gal Happy

その通り!最後に Context API について学ぼう!

  • Context API
Gal Pleased

Context APIは、複数のレイヤーを通してプロップを渡すことなく、コンポーネント間でデータを共有する方法だよ。アプリのグローバルストアのようなものだね!

Geek Curious

それは便利そう!Context APIの使い方は?

Gal Happy

まず、 React.createContext() を使ってコンテキストを作成するの。次に、 Provider を使ってデータをツリー内のすべてのコンポーネントに利用可能にするの。最後に、 ConsumeruseContext フックを使ってデータにアクセスするの!

// Create a context
const ThemeContext = React.createContext('light');

// Use a Provider
function App() {
  return (
    <ThemeContext.Provider value="dark">
      {/* ... other components ... */}
    </ThemeContext.Provider>
  );
}

// Use a Consumer or useContext hook
function ThemedButton() {
  const theme = useContext(ThemeContext);
  return <button className={`btn btn-${theme}`}>Themed Button</button>;
}
Geek Happy

わかった!Context APIを使って、プロップを渡さずにコンポーネント間でデータを共有できるんだね!

Gal Happy

その通り!これでReactの高度な概念の勉強が終わりだね!