メンチカツ

ロースカツが好きです

【メモ】resizeイベントで変更されたウィンドウの幅を取得するhooks

ウィンドウリサイズイベントで変更されたウィンドウの幅を取得するhooksのメモ

リサイズしたとき無駄に発火しないように setTimeout() を入れています。

// useWindowWidth.ts

import { useCallback, useLayoutEffect, useState } from "react";

/**
 * resizeイベントで変更されたウィンドウの幅を取得する
 * @param {number} ms - イベント発火後のdelay
 * @returns {number} window width
 */
export const useWindowWidth = (ms: number = 200): number => {
  const [width, setWidth] = useState(0);

  const updateWidth = useCallback(() => {
    const timeout = setTimeout(() => {
      setWidth(window.innerWidth);
    }, ms);
    return () => clearTimeout(timeout);
  }, [ms, setWidth]);

  useLayoutEffect(() => {
    window.addEventListener("resize", updateWidth);
    updateWidth();
    return () => window.removeEventListener("resize", updateWidth);
  }, [updateWidth]);

  return width;
};
// hooksつかいかた

import { useEffect } from "react";

const windowWidth = useWindowWidth();

// ウィンドウリサイズのたびにconsole.logが表示される
useEffect(() => console.log(windowWidth), [windowWidth]);