HOWTO · React

React で親コンポーネントから子関数を呼び出す

この記事では、親コンポーネントから子コンポーネントの関数を呼び出す方法を紹介します。

この記事では、React で子コンポーネントのメソッドを親コンポーネントに呼び出す方法を学習します。

ほとんどの場合、開発者は子コンポーネントから親コンポーネントのメソッドを呼び出す必要があり、親コンポーネントのメソッドを props として子コンポーネントに渡すことで実現できます。

逆にすることもできます。 ここでは、refs を使用して、親から子コンポーネントのメソッドを呼び出します。

React での ref の紹介

一般に、小道具を子コンポーネントに渡すことで、親コンポーネントから子コンポーネントと対話できます。 ref を使用すると、典型的な親と子のデータ フローの外でコンポーネントと対話できます。

ユーザーは、次の構文に従って ref を作成できます。

this.newRef = React.createRef();

ref を作成した後、ユーザーはそれを任意の HTML 要素またはコンポーネントの ref 属性の値として割り当てることができます。 これを Child コンポーネントの ref 属性に割り当てます。

<Child ref={this.newRef} />

これで、ユーザーは newRefcurrent 属性を介して子コンポーネントのマウントされたインスタンスにアクセスし、子コンポーネントのメソッドを呼び出すことができます。

this.childRef.current.childMethod();

したがって、このように、ref は典型的なデータ フロー外のコンポーネントと対話するのに役立ちます。

ref を使用して、クラス コンポーネントで親から子関数を呼び出す

以下の例では、App (親) と Child という 2つのコンポーネントを作成しています。 Child コンポーネントでは、レンダリングする HTML と childMethod() を追加しました。これにより、呼び出し時にアラート ボックスが表示されます。

App コンポーネントでは、コンストラクターで ref を作成し、その値を Child コンポーネントの ref 属性に割り当てました。

ユーザーが クリック ボタンをクリックすると、callChild() メソッドが呼び出されます。 callChild() メソッドは、refcurrent 属性を介して 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>;
    }
}

出力:

親 one から子関数を呼び出す

フックを使用して機能コンポーネントで親から子関数を呼び出す

以下の例では、AppChild という 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;

出力:

親 2 から子関数を呼び出す

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