Computing Atman

forwardRef

説明

forwardRefコンポーネントのサンプルコード

補足

  • forwardRefはコンポーネント内のDOMにRefオブジェクトを渡すための機能。通常のrefは、propsとして渡したり受け取ることができない。
  • useRefとforwardRefは、主に入力要素のフォーカス設定・ビデオ再生の制御に利用し、コードが複雑になるため多様は避ける。

利用するshadcn/uiコンポーネント

  • input
  • button

サンプルコード

'use client';

import { Button, Input } from '@repo/ui';
import { Ref, forwardRef, useImperativeHandle, useRef } from 'react';

interface Handler {
  setFocus(): void;
}

const InputForwardRef = forwardRef<Handler>((props, ref) => {
  const inputRef = useRef({} as HTMLInputElement);

  useImperativeHandle(ref, () => ({
    setFocus() {
      inputRef.current.focus();
    },
  }));

  return <Input type="text" ref={inputRef as Ref<HTMLInputElement>} />;
});
InputForwardRef.displayName = 'InputForwardRef';

const Example = () => {
  const ref = useRef({} as Handler);
  return (
    <div className="flex flex-col place-items-start space-y-4">
      <InputForwardRef ref={ref} />
      <Button onClick={() => ref.current.setFocus()}>Focus Input</Button>
    </div>
  );
};

export { Example };