Nextの使えるコンポーネント


画面サイズを取得する

GetWindowSize.ts

import { useEffect, useState } from "react";

export const getWindowSize = () => {
 const [windowSize, setWindowSize] = useState({
  width: 0,
  height: 0,
 });

 useEffect(() => {
  if (typeof window !== "undefined") {
   const handleResize = () => {
    setWindowSize({
     width:
      window.innerWidth,
     height: window.innerHeight,
    });
   };

   window.addEventListener("resize", handleResize);
   handleResize();
   return () => window.removeEventListener("resize", handleResize);
  } else {
   return;
  }
 }, []);
 return windowSize;
};

Next.js はPre-redndering(SSR,SSG)がサポートされているので、
Hooksでブラウザ側にしか存在しないグローバルオブジェクトのwindowやdocumentを参照する場合には必ず

if (typeof window !== "undefined") {

を実装するようにしましょう。

使い方サンプル
index.tsx

import type { NextPage } from "next";
import { getWindowSize } from "../hooks/GetWindowSize";

const Home: NextPage = () => {
  const { height, width } = getWindowSize();
  return (
    <div>
      height:{height} width:{width}
    </div>
  );
};

export default Home;


親コンポーネントから子コンポーネント内を実行する

forwardRef , useImperativeHandle を使う

● 子コンポーネントで関数 showAlert() を登録

1. メソッドの追加

import React, { useImperativeHandle, forwardRef, useRef } from "react";


// 親コンポーネントの ref.current から実行できる関数を定義したオブジェクトを返す
useImperativeHandle(ref, () => ({
  childClick() {
    voucherOpenRef.current.click();
  },
}));


2. refを受け取れるようにする

let voucher = (pops, ref) => {
  ...
};


voucher = forwardRef(voucher);


● 親コンポーネントで ref を渡す

import { useRef } from "react";


const voucherRef = useRef(null); 


<子コンポーネント
  ref={voucherRef}
/>


これで親コンポーネントから好きなタイミングで実行できるようになります。

<Button
  onClick={() => {
    voucherRef.current.childClick();
  }}
>実行ボタン</Button>