ちょっと躓いたので、備忘録としてまとめ。
React のコンポーネント間の通信についてです。
現在開発中のアプリ内で、子コンポーネントで特定の値が変更になった時に、親コンポーネントにその変更した値を渡す、という処理をしたかったので調査しました。
参考にさせていただいた記事はこちらから。
Flux を使わずに React コンポーネント間のコミュニケーションを行う8つの方法 – Qiita
https://qiita.com/kyoshidajp/items/0ddb156d96bb6337f623
子から親コンポーネントにデータを渡す方法には「コールバック関数を使う方法」と「イベントバブリングを使う方法」がありましたが、私はコールバック関数を使う方法をチョイスしました。
これは、親コンポーネントが子コンポーネントに関数を渡すという方法です。
実際のコードはこんな感じ。
まず、親コンポーネントがこちら。
import React, { Component } from 'react'; import ChildComp from './ChildComp'; class ParentPage extends Component { constructor(props) { super(props); this.state = { value: 1, } } changeValue(value) { this.setState({ value: value }); } render() { return ( <ChildComp value={this.state.value} changeValue={this.changeValue.bind(this)} /> ); } } export default ParentPage;
親コンポーネントでは、子コンポーネントを呼び出す際に、一緒に value
と changeValue
関数を渡しています。
この changeValue
関数がコールバック関数です。
行数でいうと 16行目です。
次に子コンポーネントがこちら。
import React from 'react'; import PropTypes from 'prop-types'; const ChildComp = props => ( <div> <button onClick={() => props.changeValue(props.value + 1)}>+1</button> </div> ); ChildComp.propTypes = { value: PropTypes.string.isRequired, changeValue: PropTypes.func.isRequired, }; export default ChildComp;
子コンポーネントでは、親コンポーネントから渡された value
と changeValue
関数を受け取ってそれを使って処理を行います。
サンプルコードでは、ボタンを押したタイミングで value
の値を +1 し、それを changeValue
関数を使って、親コンポーネントに渡しています。
そして親コンポーネントでは、その受け取った値を state に上書き保存しています。
なお、9~12行目の PropTypes
の宣言をお忘れなく!
サンプルコードで行っているくらいの処理であれば、別にコンポーネントを分ける必要はないのですが、ちょっと大掛かりなことをしようとしたときは、この書き方を覚えておくととても便利でした。
特に複数のページで同じ処理を行いたい場合、コンポーネントを分けておくと、同じコードを何度も書く必要はなくなるし、何より親コンポーネントのコードがすっきりします!
あまりコンポーネントを理解できていなかった時に開発したアプリでは、この分けるという作業が不十分で…大分ややこしいことになってしまっているので、時間を見つけてリファクタリングを行いたいですね…。
以上、React で子コンポーネントのデータを親コンポーネントに渡す方法でした。
ご参考になれば幸いです。