🦏 useRefの型定義と使い方
作成日: 2021/07/18
0

useRefってどういうときに使うんだ?

気になった時に読もう。
参考記事
https://qiita.com/seya/items/6bbfa3f9d489809ccb2c


import { useEffect, useRef, useState } from 'react';

// おまけ
// const array: Array<number> = [1, 2, 3];
// const readonlyArray: ReadonlyArray<number> = [1, 2, 3];
// array[0] = 11;
// readonlyArray[0] = 11;

// propsを受け取ってないので、{}にしておく
const Counter: React.FC<{}> = () => {
  // any型で指定してある
  const initialValue: any = 0;

  // useStateの初期値はnumber型だと変換出来る
  const [count, setCount] = useState<number>(initialValue);

  //   const increment = () => {
  //     setCount(count + 1);
  //   };

  const increment = () => {
    //   コールバックでの書き方 number型が指定される
    setCount((prevState) => prevState + 1);
  };

  const decrement = () => {
    //   慣れた書き方 こちらもnumber型が指定される
    setCount(count - 1);
  };

  const renderTimes = useRef<number>(0);
  useEffect(() => {
    renderTimes.current = renderTimes.current + 1;
  });
  // ノンヌルアサーションオペレーターという
  const ref = useRef<HTMLInputElement>(null!);
  const focusInput = () => {
    console.log('focus in!');
    ref.current.focus();

    // オプショナルチェイニング
    // ref.current?.focus();

    // nullチェック
    // const current = ref.current;
    // if (current != null) current.focus();
  };

  return (
    <>
      <div>count:{count}</div>
      <button onClick={increment}>+1</button>
      <button onClick={decrement}>-1</button>
      <div>This component was re-rendered {renderTimes.current} times</div>
      <input ref={ref} type='text' />
      {/* ボタンを押すとinputにフォーカスが移る */}
      <button onClick={focusInput}>Click Me</button>
    </>
  );
};

export default Counter;