React で親コンポーネントから子関数を呼び出す
この記事では、React で子コンポーネントのメソッドを親コンポーネントに呼び出す方法を学習します。
ほとんどの場合、開発者は子コンポーネントから親コンポーネントのメソッドを呼び出す必要があり、親コンポーネントのメソッドを props として子コンポーネントに渡すことで実現できます。
逆にすることもできます。 ここでは、refs を使用して、親から子コンポーネントのメソッドを呼び出します。
React での ref の紹介
一般に、小道具を子コンポーネントに渡すことで、親コンポーネントから子コンポーネントと対話できます。 ref を使用すると、典型的な親と子のデータ フローの外でコンポーネントと対話できます。
ユーザーは、次の構文に従って ref を作成できます。
this.newRef = React.createRef();
ref を作成した後、ユーザーはそれを任意の HTML 要素またはコンポーネントの ref 属性の値として割り当てることができます。 これを Child コンポーネントの ref 属性に割り当てます。
<Child ref={this.newRef} />
これで、ユーザーは newRef の current 属性を介して子コンポーネントのマウントされたインスタンスにアクセスし、子コンポーネントのメソッドを呼び出すことができます。
this.childRef.current.childMethod();
したがって、このように、ref は典型的なデータ フロー外のコンポーネントと対話するのに役立ちます。
ref を使用して、クラス コンポーネントで親から子関数を呼び出す
以下の例では、App (親) と Child という 2つのコンポーネントを作成しています。 Child コンポーネントでは、レンダリングする HTML と childMethod() を追加しました。これにより、呼び出し時にアラート ボックスが表示されます。
App コンポーネントでは、コンストラクターで ref を作成し、その値を Child コンポーネントの ref 属性に割り当てました。
ユーザーが クリック ボタンをクリックすると、callChild() メソッドが呼び出されます。 callChild() メソッドは、ref の current 属性を介して childMethod() にアクセスし、呼び出します。
コード例:
// import required libraries
import React from "react";
import Child from "./Child";
export default class APP extends React.Component {
constructor(props) {
super(props);
// Initializing the Refs
this.childRef = React.createRef();
}
// call the child method
callChild = () => {
this.childRef.current.childMethod();
};
render() {
return (
<div>
{/* Passing Ref to CHild component */}
<Child ref={this.childRef} />
<button onClick={this.callChild}>Click</button>
</div>
);
}
}
import React from "react";
export default class Child extends React.Component {
childMethod() {
alert('Called the Method of Child.');
}
render() {
return <h1>This is From Child Component.</h1>;
}
}
出力:

フックを使用して機能コンポーネントで親から子関数を呼び出す
以下の例では、App と Child という 2つの関数コンポーネントを作成しています。 useRef フックを使用して親コンポーネント内の Child コンポーネントにアクセスするために forwardRef フック内に Child コンポーネントをラップしました。
また、useImperativeHandle を使用し、ref を最初のパラメーターとして、コールバック関数を 2 番目のパラメーターとして渡しました。 ここで、Child コンポーネントは、コールバック関数が返すものを拡張します。
useRef フックの current 属性を介して、親コンポーネントのコールバック関数から返された値にアクセスできます。
コード例 - (App.js):
// import required libraries
import React, { useRef } from "react";
import Child from "./Child";
export default function APP() {
// use hooks to create `ref`
const childRef = useRef();
// call child method
const onClick = () => {
childRef.current.childMethod();
};
return (
<div>
{/* Passing Ref to CHild component */}
{/* use `refs` */}
<Child ref={childRef} />
<button onClick={onClick}>Click</button>
</div>
);
}
コード例 - (Child.js):
import React, { forwardRef, useImperativeHandle } from "react";
// While using the hooks, it is required to wrap the component inside the forwardRef to gain access to the ref object,
//, which we create using the `useref` hooks inside the parent component.
const Child = forwardRef((props, ref) => {
// Extending the child component with the return value of the callback function passed as a second parameter of the useImperatuveHandle.
useImperativeHandle(ref, () => ({
childMethod() {
alert("Called the Method of Child.");
},
}));
return <h1>Use Refs in functional component.</h1>;
});
export default Child;
出力:

ref を使用して、親関数から子関数を呼び出すことを学びました。 また、ユーザーは ref を使用して親コンポーネントを介して子コンポーネントを変更できます。
