1

幅に基づいてスライダーのカスタム スクロール動作を実装しようとしています。スライダー内の現在のページと合計ページを追跡するために、useState を使用しています。これは私がコンパイルしようとしたコードですが、予期しない動作がいくつかあります。

const [isTimeoutLocked, setIsTimeoutLocked] = useState(false)
const handleScroll = useCallback(() => {
  
    const gridContainer = document.querySelector(".grid");
    const totalPages = Math.ceil(
            gridContainer.scrollWidth / gridContainer.clientWidth + -0.1
        );
    setTotalPages(totalPages);
    const scrollPos = gridContainer.clientWidth + gridContainer.scrollLeft + 2;
    if (gridContainer.scrollWidth > scrollPos) {
        gridContainer.scrollBy({
            left: gridContainer.clientWidth + 20.5,
            behavior: "auto",
            block: "center",
            inline: "center",
        });
        setCurrentPage(currentPage + 1);
        setIsTimeoutLocked(false)
        } else {
            gridContainer.scrollTo(0, 0);
            setCurrentPage(1);
            setIsTimeoutLocked(false)
        }
    },[currentPage]);


    useEffect(() => {
    if(!isTimeoutLocked){
        setTimeout(() => {
            setIsTimeoutLocked(true)
            document.querySelector(".grid") && handleScroll();
        }, 5000);
    }
    
}, [currentPage, displayDate, isTimeoutLocked, handleScroll]);

ここでの問題は、currentPage が UI に表示されているときに、else が handleScroll 関数内で実行されると 1 にリセットされることです。これはまったく問題ありませんが、取得時に 2 に戻るのではなく、前の値に戻ります。次のページへ。また、isTimeoutLocked を useEffect の依存関係として追加したため、setTimeout はより頻繁に実行されますが、正しい値を取得するための依存関係としてのみ使用したいので、変更のたびに useEffect が実行されるわけではありません。isTimeoutLocked の目的は、現在の日付を変更してコンテナ内のコンテンツを変更したときに、多数のタイムアウトが登録されないようにすることです。

4

1 に答える 1