Ответ 1
Вам не нужны миксины для использования EventEmitters.
Простая демонстрация:
import EventEmitter from 'EventEmitter';
let x = new EventEmitter();
function handler(arg) {
console.log(`event-name has occurred! here is the event data arg=${JSON.stringify(arg)}`);
}
x.addListener('event-name', handler);
x.emit('event-name', { es6rules: true, mixinsAreLame: true });
Полная подпись для addListener
принимает три аргумента:
EventEmitter.addListener(eventName, handler, handlerContext)
В реагирующем компоненте вы, скорее всего, захотите использовать этот контекстный аргумент, чтобы обработчик мог быть методом класса вместо встроенной функции и по-прежнему сохранять this == component instance
. Например:.
componentDidMount() {
someEmitter.addListener('awesome', this.handleAwesomeEvents, this);
// the generalist suggests the alternative:
someEmitter.addListener('awesome', this.handleAwesomeEvents.bind(this));
}
handleAwesomeEvents = (event) => {
let awesomeness = event.awesomeRating;
// if you don't provide context in didMount,
// "this" will not refer to the component,
// and this next line will throw
this.setState({ awesomeness });
};
FYI: Я получил это от взгляда на явно неважную реализацию печально известного Подписываемого mixin. Результаты поиска в Google - это, в основном, эхо-камера демо-версии, основанной на одном микшинге от Ramsay.
P.S. Поскольку выставляя этот эмиттер другому компоненту, я бы, вероятно, обладал бы компонентом-обладателем функции для получения ссылки эмиттера, а компонент, который создает эмиттер, затем условно выполнил бы эту опору с эмиттером.
// owner render method:
<ThingThatEmits
onEmitterReady={(emitter) => this.thingEmitter = emitter}
/>
// inside ThingThatEmits:
componentDidMount() {
this.emitter = new EventEmitter();
if(typeof this.props.onEmitterReady === 'function') {
this.props.onEmitterReady(this.emitter);
}
}