--- title: useInfiniteScroll description: "`useInfiniteScroll`は、無限スクロール機能を提供するカスタムフックです。" links: - source: https://github.com/yamada-ui/yamada-ui/tree/main/packages/react/src/hooks/use-infinite-scroll - storybook: https://yamada-ui.github.io/yamada-ui?path=/story/hooks-useinfinitescroll--basic --- ```tsx const [count, setCount] = useState(50) const { ref, finish } = useInfiniteScroll({ onLoad: ({ finish, index }) => { console.log("onLoad", index) setCount((prev) => prev + 50) if (index >= 5) finish() }, }) return ( {Array(count) .fill(0) .map((_, index) => ( 天元突破グレンラガン いいか、忘れんな。お前を信じろ。俺が信じるお前でもない。お前が信じる俺でもない。お前が信じる…お前を信じろ! ))} {!finish ? (
) : null}
) ``` ## 使い方 ```tsx import { useInfiniteScroll } from "@yamada-ui/react" ``` ```tsx import { useInfiniteScroll } from "@/components/ui" ``` ```tsx import { useInfiniteScroll } from "@workspace/ui" ``` ```tsx const { ref, finish } = useInfiniteScroll() ``` ### ビューポートを指定する ビューポートを指定する場合は、`rootRef`に`ref`を設定します。 :::note `rootRef`が設定されない場合は、ブラウザのビューポートが使用されます。 ::: ```tsx const rootRef = useRef(null) const resetRef = useRef<() => void>(noop) const [count, setCount] = useState(50) const { ref, finish } = useInfiniteScroll({ resetRef, rootRef, onLoad: ({ finish, index }) => { console.log("onLoad", index) setCount((prev) => prev + 50) if (index >= 5) finish() }, }) return ( {Array(count) .fill(0) .map((_, index) => ( 天元突破グレンラガン いいか、忘れんな。お前を信じろ。俺が信じるお前でもない。お前が信じる俺でもない。お前が信じる…お前を信じろ! ))} {!finish ? (
) : null}
) ``` ### rootMarginを設定する [rootMargin](https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API#rootmargin)を設定する場合は、`rootMargin`に文字列を設定します。 ```tsx const [count, setCount] = useState(50) const { ref, finish } = useInfiniteScroll({ rootMargin: "300px 0px 0px 0px", onLoad: ({ finish, index }) => { console.log("onLoad", index) setCount((prev) => prev + 50) if (index >= 5) finish() }, }) return ( {Array(count) .fill(0) .map((_, index) => ( 天元突破グレンラガン いいか、忘れんな。お前を信じろ。俺が信じるお前でもない。お前が信じる俺でもない。お前が信じる…お前を信じろ! ))} {!finish ? (
) : null}
) ``` ### thresholdを設定する [threshold](https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API#threshold)を設定する場合は、`threshold`に数値を設定します。 ```tsx const [count, setCount] = useState(50) const { ref, finish } = useInfiniteScroll({ threshold: 1, onLoad: ({ finish, index }) => { console.log("onLoad", index) setCount((prev) => prev + 50) if (index >= 5) finish() }, }) return ( {Array(count) .fill(0) .map((_, index) => ( 天元突破グレンラガン いいか、忘れんな。お前を信じろ。俺が信じるお前でもない。お前が信じる俺でもない。お前が信じる…お前を信じろ! ))} {!finish ? (
) : null}
) ``` ### 初回に読み込む 初回に読み込む場合は、`initialLoad`を`true`に設定します。デフォルトでは、`initialLoad`が`false`に設定されており、初回(`index=0`)の`onLoad`は実行されません。 `true`: スクロール量に関わらず、初回の`onLoad`は実行され、提供される`index`は`0`から始まります。\ `false`: スクロールが一定に達すると`onLoad`が実行され、提供される`index`は`1`から始まります。 ```tsx const [count, setCount] = useState(50) const { ref, finish } = useInfiniteScroll({ initialLoad: true, onLoad: ({ finish, index }) => { console.log("onLoad", index) setCount((prev) => prev + 50) if (index >= 5) finish() }, }) return ( {Array(count) .fill(0) .map((_, index) => ( 天元突破グレンラガン いいか、忘れんな。お前を信じろ。俺が信じるお前でもない。お前が信じる俺でもない。お前が信じる…お前を信じろ! ))} {!finish ? (
) : null}
) ``` ### 開始するindexを変更する 開始する`index`を変更する場合は、`startIndex`に数値を設定します。デフォルトは、`1`です。 ```tsx const [count, setCount] = useState(50) const { ref, finish } = useInfiniteScroll({ startIndex: 3, onLoad: ({ finish, index }) => { console.log("onLoad", index) setCount((prev) => prev + 50) if (index >= 5) finish() }, }) return ( {Array(count) .fill(0) .map((_, index) => ( 天元突破グレンラガン いいか、忘れんな。お前を信じろ。俺が信じるお前でもない。お前が信じる俺でもない。お前が信じる…お前を信じろ! ))} {!finish ? (
) : null}
) ``` ### 反転させる 反転させる場合は、`reverse`を`true`に設定します。デフォルトは、`false`です。 ```tsx const rootRef = useRef(null) const [count, setCount] = useState(50) const { ref, finish } = useInfiniteScroll({ reverse: true, rootRef, onLoad: ({ finish, index }) => { console.log("onLoad", index) setCount((prev) => prev + 50) if (index >= 5) finish() }, }) return ( {!finish ? (
) : null} {Array(count) .fill(0) .map((_, index) => ( 天元突破グレンラガン いいか、忘れんな。お前を信じろ。俺が信じるお前でもない。お前が信じる俺でもない。お前が信じる…お前を信じろ! ))}
) ```