ReactでEventEmitterを使って子コンポーネント同士の通信を行ってみた
はじめに
Reactで趣味プロダクトを作っているのですが、途中子コンポーネント同士でのやり取りがしたくて、発行購読パターンみたいな事がしたいなと思ったんですが、何かいい方法があるのかなーと思って調べていると、EventEmitterの存在を知ったので使ってみました。
EventEmitterとは
EventEmitterは直訳の通り、イベントを発火することができる機能で、主に「イベントを発火する人」と「イベントを受け取る人」の大きく2つに使い方が分かれます。
Node.jsの組み込みモジュールが有名なのかな?
やってみる
EventEmitterを使う上で、最初はこのEventEmitterを使ってみていたのですが、Netlifyでエラーを吐いたので、fbemitterを使ってみました。
こんな感じで書いたら使えました。
// Parent.js
import {EventEmitter} from 'fbemitter'
:
constructor () {
super()
this.emitter = new EventEmitter()
}
render () {
return (
:
<Component emitter={this.emitter} />
)
}
// ChildA.js
constructor (props) {
super(props)
this.emitter = this.props.emitter
this.emitter.addListener(
'eventName', () => {
// some code
})
}
// ChildB.js
constructor (props) {
super(props)
this.emitter = this.props.emitter
}
someMethod() {
this.emitter.emit('eventName')
}
- ポイント1: 親でimport/instanceして、同じものを実際に使用する子コンポーネントに渡してあげる必要がある。
- ポイント2: Listenerを増やすときは、addListenerは複数付ける。EventEmitter側でonメソッドを使用した際も、jQueryのonみたく1個のメソッド内で複数のEvent登録はできなかった。
まとめ
EventEmitterで発行購読パターンみたいな実装ができた。今回はこれでリクエスト時のローディングアニメーションの管理をしてみたんだけどいい感じ。他にも使えそう。