forwardRef , useImperativeHandle を使います
import React, { useImperativeHandle, forwardRef, useRef } from "react";
https://react.dev/reference/react/useImperativeHandle
useImperativeHandle は forwardRef と組み合わせて使います。
useImperativeHandle は コンポーネントにメソッドを生やす Hooks です
import { useImperativeHandle, forwardRef } from "react";
useImperativeHandle(
ref,
() => ({
showAlert() {
alert("Child Function Called")
}
}),
)
const MyChildComponent = (props) => {
↓
const MyChildComponent = (props, ref) => {
export default MyParentComponent;
↓
export default forwardRef(MyParentComponent);
import { useRef } from "react";
const childRef = useRef();
<MyChildComponent
ref={childRef}
/>
後は親コンポーネントの好きなところから関数を呼ぶことができます
<button type="button"
onClick={ () => { childRef.current.showAlert() }}
>
関数コンポーネントはクラスとどう違うのか? — Overreacted
子コンポーネントのuseImperativeHandle を次のようにします。
useImperativeHandle(
ref,
() => (
{
showAlert: async function(){ await showAlert(); } ,
}
)
)
また showAlert() 関数にも async をつけておきます
ForwardRefRenderFunction を使います
import React, { useImperativeHandle, forwardRef } from "react";
interface Props {
text: string;
}
interface Handler {
showAlert(): void;
}
const ChildBase: React.ForwardRefRenderFunction<Handler, Props> = (
props,
ref
) => {
// 公開する関数
useImperativeHandle(ref, () => ({
showAlert() {
alert(props.text);
},
}));
return <span>{props.text}</span>;
};
const VFCChild = forwardRef(ChildBase);
export default VFCChild;