custom hooks
2025-05-13
カスタムフック化の手順
1. hooksディレクトリを作成(まだなければ)
プロジェクトのルートやsrc/配下などにhooksディレクトリを作ります。
2. カスタムフックのファイルを作成
例:useBlobMouseMove.ts
3. カスタムフックのコードを書く
// hooks/useBlobMouseMove.ts
import { useEffect, RefObject } from "react"
export function useBlobMouseMove(*blobRef*: RefObject<HTMLDivElement>) {
useEffect(() => {
const handleMouseMove = (*e*: MouseEvent) => {
if (!blobRef.current) return
const { clientX, clientY } = e
const x = clientX - blobRef.current.offsetWidth / 2
const y = clientY - blobRef.current.offsetHeight / 2
setTimeout(() => {
if (blobRef.current) {
blobRef.current.style.transform = `translate(${x * 0.05}px, ${y * 0.05}px)`
}
}, 100)
}
window.addEventListener("mousemove", handleMouseMove)
return () => window.removeEventListener("mousemove", handleMouseMove)
}, [blobRef])
}
4. 使いたいファイルでimportして利用
import { useRef } from "react"
import { useBlobMouseMove } from "@/hooks/useBlobMouseMove"
const blobRef = useRef<HTMLDivElement>(null)
useBlobMouseMove(blobRef)
return (
<div *ref*={blobRef} ... />
)
まとめ
- hooksディレクトリにカスタムフックを作成
- 使いたいコンポーネントでimportして使う
これで、どのページやコンポーネントでも同じマウス追従アニメーションを簡単に再利用できる
ポイント
- hooks/useBlobMouseMove.tsx にカスタムフック(useBlobMouseMove)を作成
- app/page.tsx で import { useBlobMouseMove } from "@/hooks/useBlobMouseMove" としてインポート
- const blobRef = useRef
(null) でrefを作成し、useBlobMouseMove(blobRef) でフックを呼び出し - 対象のdivに ref={blobRef} を付与
この構成で、カスタムフックの再利用性・保守性が高まり、他のページやコンポーネントでも同じアニメーションを簡単に使える状態になる
//useBlobMouseMove.tsx
ちなみに、このカスタムフックを他のworks,anout,contactなどにも適応したい場合は各ページに読ませるのか?それともLayout.tsxの共通ページに読ませるのか?どちらがいいか?
どちらが良いかの結論
- 各ページごとにblobを表示・アニメーションさせたい場合
→ 各ページ(例:works/page.tsx, about/page.tsx, contact/page.tsx)でカスタムフックを呼び出すのがベストです。
- 全ページ共通の背景装飾としてblobを表示・アニメーションさせたい場合
→ layout.tsx(共通レイアウト)でカスタムフックを呼び出し、blobを配置するのがベスト
各ページで呼び出す場合
- ページごとにblobのデザインや動きを変えたい場合に柔軟。
- そのページだけにblobを表示したい場合に最適。
- ページ単位で管理できるので、不要なページには表示しないで済む。
layout.tsxで呼び出す場合
- 全ページで同じblobを共通で表示したい場合に便利。
- 例えば「全ページの背景に常にblobがある」など、グローバルな装飾にしたい場合に最適。
- ただし、ページごとに異なるblobを出したい場合は工夫が必要。
まとめ
- ページごとに個別のblobを出したい → 各ページでカスタムフックを使う
- 全ページ共通のblobを出したい → layout.tsxでカスタムフックを使う