ReactJSで親コンポーネントのメソッドを呼び出す:高階コンポーネント (HOC)を使う
ここでは、ReactJSで親コンポーネントのメソッドを呼び出す方法について、3つの代表的な方法を紹介します。
ref
を使う方法は、最もシンプルで直感的な方法です。
親コンポーネント
- 子コンポーネントのインスタンスを保持するために、
ref
変数を定義します。 ref
変数を子コンポーネントのref
属性に渡します。
const App = () => {
const childRef = useRef();
const handleClick = () => {
// 子コンポーネントの `doSomething` メソッドを呼び出す
childRef.current.doSomething();
};
return (
<div>
<Child ref={childRef} />
<button onClick={handleClick}>親コンポーネントのボタン</button>
</div>
);
};
ref
を受け取り、current
プロパティを使ってインスタンスを取得します。- 子コンポーネント内で呼び出したいメソッドを定義します。
const Child = ({ ref }) => {
const doSomething = () => {
// 何か処理を行う
};
useEffect(() => {
// `ref.current` は子コンポーネントのインスタンスを指します
console.log(ref.current);
}, []);
return (
<div>
// 子コンポーネントのコード
</div>
);
};
callback
を使う方法は、親コンポーネントから子コンポーネントへ関数を渡す方法です。
- 子コンポーネントに渡す関数を定義します。
- 子コンポーネントに
callback
propとして関数を渡します。
const App = () => {
const handleClick = () => {
// 何か処理を行う
};
return (
<div>
<Child callback={handleClick} />
</div>
);
};
callback
propを受け取り、必要なタイミングで呼び出します。
const Child = ({ callback }) => {
const doSomething = () => {
// 親コンポーネントから渡された `callback` 関数を呼び出す
callback();
};
return (
<div>
// 子コンポーネントのコード
<button onClick={doSomething}>子コンポーネントのボタン</button>
</div>
);
};
Context
を使う方法は、複数のコンポーネント間でデータを共有する際に有効な方法です。
Context
オブジェクトを作成し、親コンポーネントで状態を管理します。- 子コンポーネントに
Context
をラップします。
const App = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
};
return (
<div>
<MyContext.Provider value={{ count, handleClick }}>
<Child />
</MyContext.Provider>
</div>
);
};
Context
を使って、親コンポーネントで定義された状態や関数を取得します。
const Child = () => {
const { count, handleClick } = useContext(MyContext);
return (
<div>
// 親コンポーネントの `count` を表示
{count}
// 親コンポーネントの `handleClick` を呼び出す
<button onClick={handleClick}>ボタン</button>
</div>
);
};
ReactJSで
refを使う
const App = () => {
const childRef = useRef();
const handleClick = () => {
// 子コンポーネントの `doSomething` メソッドを呼び出す
childRef.current.doSomething();
};
return (
<div>
<Child ref={childRef} />
<button onClick={handleClick}>親コンポーネントのボタン</button>
</div>
);
};
const Child = ({ ref }) => {
const doSomething = () => {
// 何か処理を行う
console.log("子コンポーネントの `doSomething` メソッドが呼び出されました");
};
useEffect(() => {
// `ref.current` は子コンポーネントのインスタンスを指します
console.log(ref.current);
}, []);
return (
<div>
// 子コンポーネントのコード
</div>
);
};
callbackを使う
const App = () => {
const handleClick = () => {
// 何か処理を行う
console.log("親コンポーネントの `handleClick` メソッドが呼び出されました");
};
return (
<div>
<Child callback={handleClick} />
</div>
);
};
const Child = ({ callback }) => {
const doSomething = () => {
// 親コンポーネントから渡された `callback` 関数を呼び出す
callback();
};
return (
<div>
// 子コンポーネントのコード
<button onClick={doSomething}>子コンポーネントのボタン</button>
</div>
);
};
Contextを使う
const App = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
};
return (
<div>
<MyContext.Provider value={{ count, handleClick }}>
<Child />
</MyContext.Provider>
</div>
);
};
const Child = () => {
const { count, handleClick } = useContext(MyContext);
return (
<div>
// 親コンポーネントの `count` を表示
{count}
// 親コンポーネントの `handleClick` を呼び出す
<button onClick={handleClick}>ボタン</button>
</div>
);
};
動作確認
上記のサンプルコードをReactプロジェクトで実行すると、以下のような動作を確認できます。
refを使う
- 親コンポーネントのボタンをクリックすると、子コンポーネントの
doSomething
メソッドが呼び出されます。 - コンソールには、子コンポーネントのインスタンス情報が表示されます。
callbackを使う
- 親コンポーネントの
handleClick
メソッドが呼び出されます。 - コンソールには、「親コンポーネントの
handleClick
メソッドが呼び出されました」というメッセージが表示されます。
ReactJSで親コンポーネントのメソッドを呼び出す方法
Redux
は、状態管理ライブラリです。Redux
を使うと、コンポーネント間の状態共有を簡単に実現できます。
Redux
storeに状態とアクションを定義します。- 子コンポーネントに
connect
関数を使ってRedux
storeに接続します。
const App = () => {
const store = createStore(reducer);
return (
<Provider store={store}>
<Child />
</Provider>
);
};
const mapStateToProps = (state) => {
return {
count: state.count,
};
};
const mapDispatchToProps = (dispatch) => {
return {
handleClick: () => dispatch({ type: "INCREMENT" }),
};
};
const Child = connect(mapStateToProps, mapDispatchToProps)(ChildComponent);
props
からcount
とhandleClick
を受け取り、必要なタイミングで呼び出します。
const ChildComponent = ({ count, handleClick }) => {
return (
<div>
// 親コンポーネントの `count` を表示
{count}
// 親コンポーネントの `handleClick` を呼び出す
<button onClick={handleClick}>ボタン</button>
</div>
);
};
高階コンポーネント (HOC)を使う
HOCは、コンポーネントに機能を追加するためのパターンです。HOCを使うと、親コンポーネントのメソッドを子コンポーネントに簡単に渡すことができます。
- HOCを作成し、親コンポーネントのメソッドをラップします。
const withHOC = (WrappedComponent) => {
const handleClick = () => {
// 何か処理を行う
};
return (props) => {
return (
<WrappedComponent handleClick={handleClick} {...props} />
);
};
};
const App = () => {
return (
<div>
<Child />
</div>
);
};
const Child = withHOC(ChildComponent);
const ChildComponent = ({ handleClick }) => {
return (
<div>
// 親コンポーネントの `handleClick` を呼び出す
<button onClick={handleClick}>ボタン</button>
</div>
);
};
- 子コンポーネントでカスタムフックを使用します。
const useClick = () => {
const handleClick = () => {
// 何か処理を行う
};
return handleClick;
};
const App = () => {
return (
<div>
<Child />
</div>
);
};
const Child = () => {
const handleClick = useClick();
return (
<div>
// 親コンポーネントの `handleClick` を呼び出す
<button onClick={handleClick}>ボタン</button>
</div>
);
};
ReactJSで親コンポーネントのメソッドを呼び出す方法はいくつかあります。それぞれ
javascript reactjs