●目次
useRef
と、それに関連するforwardRef
は、コンポーネント間での参照の受け渡しや、DOM要素への直接アクセスが可能になり、React開発がより便利になります。
useRef
のおさらい!
useRef
は、再レンダリングを引き起こさずに、値を保持するためのReactフックです。
また、DOM要素への参照を保持するためにも使われます。
import React, { useRef } from 'react';
function Example() {
// refContainer.currentで値にアクセスできます
const refContainer = useRef(initialValue);
}
forwardRef
とは?
forwardRef
の基本
forwardRef
は、親コンポーネントから渡されたref
を子コンポーネント内で使用できるようにするための関数です。
これにより、親から子、さらには孫コンポーネントへとref
を渡すことが可能になります。
forwardRef
の引数:
関数コンポーネントを受け取り、そのコンポーネントでref
を扱えるようにします。ref
の受け取り方:
コンポーネントの第二引数としてref
を受け取ります。
forwardRef
の特徴
関数コンポーネントでref
を使用可能にする:
通常、関数コンポーネントはref
を直接受け取れませんが、forwardRef
を使うことで可能になります。
親から子へのref
の受け渡し:DOM要素やクラスコンポーネントへのref
を子コンポーネント経由で渡せます。
components/FancyButton.jsx
import React, { forwardRef } from 'react';
const FancyButton = forwardRef((props, ref) => (
<button ref={ref} className="fancy-button">
{props.children}
</button>
));
useRef
とforwardRef
の組み合わせ
useRef
とforwardRef
を組み合わせることで、親コンポーネントから子コンポーネント内部のDOM要素に直接アクセスできます。
これは、フォームの入力欄にフォーカスを当てたり、動画の再生・停止を制御したりする際に非常に便利です。
実践的な例:親コンポーネントから子コンポーネントのDOMにアクセス
親コンポーネント
App.js
import React, { useRef } from 'react';
import CustomInput from './CustomInput';
function App() {
const inputRef = useRef(null);
const focusInput = () => {
inputRef.current.focus();
};
return (
<div>
<CustomInput ref={inputRef} />
<button onClick={focusInput}>フォーカスを当てる</button>
</div>
);
}
export default App;
子コンポーネント
forwardRef
を使用:CustomInput
コンポーネントがref
を受け取れるようにします。
ref
の設定:
受け取ったref
を内部の<input>
要素に渡します。
親コンポーネントから子コンポーネントのinput
要素にフォーカスを当てる。
CustomInput.js
import React, { forwardRef } from 'react';
const CustomInput = forwardRef((props, ref) => {
return <input ref={ref} type="text" />;
});
export default CustomInput;
fowardRefの注意点
forwardRef
を使用しない場合
ref
はundefined
になる:forwardRef
を使わずに子コンポーネントにref
を渡すと、ref
はundefined
となり、current
プロパティにアクセスできません。
クラスコンポーネントの場合
forwardRef
は不要:クラスコンポーネントではref
を直接受け取ることができます。
複数のref
を扱う場合
useImperativeHandle
を使用:forwardRef
と組み合わせて、カスタムのref
ハンドリングが可能です。
まとめ
useRef
とforwardRef
を理解し、組み合わせて使用することで、Reactにおけるコンポーネント間のref
の受け渡しが可能になります。
これにより、親コンポーネントから子コンポーネント内部のDOM要素にアクセスしたり、関数コンポーネントでref
を扱ったりすることができます。
useRef
:
値やDOM要素への参照を保持します。.current
プロパティ:
参照している値やDOM要素にアクセスします。forwardRef
:
親コンポーネントから渡されたref
を子コンポーネントで受け取り、内部で使用可能にします。