この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - React コーディング問題
6. useHover()

以下が私たちの解決策です。

import { useState, useEffect, useRef } from 'react';

function useHover() {
  const [hovered, setHovered] = useState(false);
  const ref = useRef(null);

  function handleMouseOver() {
    setHovered(true);
  }

  function handleMouseOut() {
    setHovered(false);
  }

  useEffect(() => {
    const node = ref.current;
    node.addEventListener('mouseover', handleMouseOver);
    node.addEventListener('mouseout', handleMouseOut);

    return () => {
      node.removeEventListener('mouseover', handleMouseOver);
      node.removeEventListener('mouseout', handleMouseOut);
    };
  }, []);

  return [ref, hovered];
}

function App() {
  const [ref, isHovered] = useHover();
  return (
    <div ref={ref}>
      {isHovered ? 'hovered' : 'not hovered'}
    </div>
  );
}

export default App;

この Hook は、配列に 2 つの要素を返します。第 1 要素は、コンポーネントに渡すために参照を保持する useRef フックであり、第 2 要素は、現在要素がホバーされているかどうかを示す真偽値です。

useEffect フックは、コンポーネントが最初にマウントされるときにのみ実行されます。 その後、ref.current.addEventListener メソッドを使用して、イベントリスナーが設定され、戻り関数でイベントリスナーが削除されるようにします。

このように、useHover フックはホバー状態を追跡し、それが原因で UI が変更される可能性がある場所で簡単に使用できます。