Рубрики
Без рубрики

Создание простых реактивных приложений, используя Eventemitters

Узнайте, как Eventemitters может помочь вам создать простые реагированные приложения с простыми модульными компонентами, которые легко поддерживать.

Автор оригинала: Mohan Thaya.

Я признаю, что дебаты для Redux VS. Flux был урегулирован, и нет смысла в системе так тривиально, как Eventemitter. Но, работая с реагированием и Redux более года, я нашел две вещи:

  1. Redux трудно обернуть голову для новичка.
  2. Со всеми сложными вещами, которые могут быть достигнуты с помощью Redux, иногда это может быть слишком много.

В моей компании мы должны разработать несколько небольших модульных веб-порталов. Итак, мы придумали простой шаблон только ради этого.

Примечание: Я не пробовал это с большими сложными приложениями. Так будет предупреждено!

Так, как это работает??

Составная часть

Для отсутствия лучшего примера я решил использовать приложение TODO для демонстрации.

Вот обычный способ реализации Todo: https://jsfiddle.net/mokanArangan/ups7z2s4/

Затем я добавил свой единственный клиент:

/**
* Defines the abstract client
*/
import EventEmitter from 'eventemitter3';
import _ from 'lodash';

export default class BaseClient {

  /**
   * Initiate the event emitter
   */
constructor() {
  this.eventEmitter = new EventEmitter();
}

  /**
   * Adds the @listener function to the end of the listeners array
   * for the event named @eventName
   * Will ensure that only one time the listener added for the event
   *
   * @param {string} eventName
   * @param {function} listener
   */
on(eventName, listener) {
   this.eventEmitter.on(eventName, listener); 
}

  /**
   * Will temove the specified @listener from @eventname list
   *
   * @param {string} eventName
   * @param {function} listener
   */
removeEventListener(eventName, listener) {
  this.eventEmitter.removeListener(eventName, listener);
}

/**
 * Will emit the event on the evetn name with the @payload
 * and if its an error set the @error value
 *
 * @param {string} event
 * @param {object} payload
 * @param {boolean} error
 */
emit(event, payload, error = false) {
  this.eventEmitter.emit(event, payload, error);
}


  /**
   * Returns the event emitter
   * Used for testing purpose and avoid using this during development
   */
getEventEmitter() {
  return this.eventEmitter;
}
}

Комментарии, надеюсь, уже были добавлены. Теперь мы можем отделить два компонента и подключить теми только с событиями.

Добавьте прослушиватель на компонент Размонтировать и удалить их в размонтилении:

// Listen for event 
componentWillMount() { 
  client.on('TODO_ADDED', this.addEvent); 
} 
  
//Remove listener 
componentWillUnmount(){ 
  client.removeListener('TODO_ADDED', this.addEvent);
}

Теперь вам не нужно передавать функцию addEvent в качестве опоры. https://jsfiddle.net/mokanArangan/ne0rt40f/

И вуаля, это сделано. Нет более грязных прохождений с помощью вложенных компонентов. Вместо этого у вас теперь простые модульные компоненты, которые легко поддерживать.

Таким образом, мы можем иметь несколько модульных компонентов, которые не нужно знать о других компонентах. Это не ракетная наука, и, надеюсь, этот учебник поможет вам построить простые приложения без особых хлопот.