← Назад к вопросам

Какие знаешь сущности Flux-архитектуры?

2.0 Middle🔥 141 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сущности Flux-архитектуры: принципы, компоненты и взаимодействие

Flux — это архитектурный паттерн, разработанный Facebook для управления состоянием в клиентских приложениях, особенно в сложных SPA (Single Page Applications). Он решает проблемы прямых двусторонних связей между компонентами, обеспечивая более строгую и предсказуемую модель потока данных. Основная идея Flux — однонаправленный поток данных, который устраняет хаос и непредсказуемость, характерные для традиционных MVC (Model-View-Controller) подходов при масштабировании.

Ключевые сущности (компоненты) Flux

Архитектура Flux состоит из четырех четко разделенных сущностей, каждая со строго определенной ролью:

1. Actions (Действия)

Actions — это простые объекты, которые описывают "что произошло" в системе. Они являются единственным источником информации для Dispatcher и Store. Action содержит обязательное поле type (строка-константа) и опциональные данные (payload).

// Пример Action Creator (функция, создающая действие)
const TodoActionCreators = {
  addTodo(text) {
    // Возвращает объект Action
    return {
      type: 'ADD_TODO',
      payload: {
        text: text,
        createdAt: Date.now()
      }
    };
  }
};
  • Action Creators — это функции, которые создают и возвращают объекты действий. Они часто используются для инкапсуляции логики создания действия (например, добавление ID, timestamp).
  • Actions являются dispatcher-centric: они не содержат бизнес-логики, лишь передают данные.

2. Dispatcher (Диспетчер)

Dispatcher — это центральный координатор, который получает все Actions и распределяет их по зарегистрированным Stores. Это глобальный синглтон в приложении. Его ключевые функции:

  • Регистрация Stores: каждый Store регистрирует себя в Dispatcher, предоставляя callback-функцию.
  • Распределение Actions: когда Action отправляется (диспатчится), Dispatcher вызывает callback-функции всех зарегистрированных Stores в определенном порядке.
  • Управление зависимостями: может обеспечивать порядок обработки, если один Store зависит от другого (через waitFor()).
// Пример использования Dispatcher (на базе Facebook Flux)
const Dispatcher = require('flux').Dispatcher;
const AppDispatcher = new Dispatcher();

// Регистрация Store
TodoStore.dispatchToken = AppDispatcher.register((action) => {
  switch (action.type) {
    case 'ADD_TODO':
      TodoStore.addTodo(action.payload.text);
      TodoStore.emit('change'); // Сообщает View об изменении
      break;
    // обработка других action types...
  }
});

3. Stores (Сторы / хранилища)

Stores содержат состояние приложения и всю бизнес-логику, связанную с этим состоянием. Это не модели, а скорее "контейнеры состояния". Их характеристики:

  • Каждый Store управляет конкретной частью состояния приложения (например, TodoStore, UserStore).
  • Логика обновления: Store реагирует на Actions, полученные через Dispatcher, и обновляет свое состояние согласно типу Action.
  • Отсутствие сеттеров: состояние Stores меняется только через Actions → Dispatcher.
  • Event Emitter: после обновления состояния Store генерирует событие (например, 'change'), чтобы Views могли узнать об изменениях.
// Пример структуры Store (с использованием EventEmitter)
const EventEmitter = require('events').EventEmitter;

class TodoStore extends EventEmitter {
  constructor() {
    super();
    this.todos = [];
  }

  getAll() {
    return this.todos;
  }

  addTodo(text) {
    this.todos.push({ text, completed: false });
  }

  // Метод, вызываемый Dispatcher callback
  handleAction(action) {
    if (action.type === 'ADD_TODO') {
      this.addTodo(action.payload.text);
      this.emit('change');
    }
  }
}

4. Views (Представления / компоненты)

Views — это компоненты пользовательского интерфейса (в React-контексте это React Components). Их роль:

  • Отображают данные из Stores.
  • Слушают события изменений от Stores (через механизм подписки, например, Store.addChangeListener()).
  • Когда Store изменяется и emits событие, View получает новые данные и перерисовывается.
  • Генерируют Actions: когда пользователь взаимодействует с интерфейсом (клик, ввод), View не изменяет Store напрямую. Вместо этого он вызывает Action Creator, который создает и диспатчит Action.
// Пример React View (Component)
class TodoListView extends React.Component {
  componentDidMount() {
    TodoStore.addChangeListener(this._onChange.bind(this));
  }

  componentWillUnmount() {
    TodoStore.removeChangeListener(this._onChange.bind(this));
  }

  _onChange() {
    // При изменении Store получаем новые данные и обновляем состояние компонента
    this.setState({ todos: TodoStore.getAll() });
  }

  handleAddTodoClick(text) {
    // В ответ на действие пользователя создаем и диспатчим Action
    const action = TodoActionCreators.addTodo(text);
    AppDispatcher.dispatch(action); // Не напрямую в Store!
  }

  render() {
    // Рендер на основе состояния из Store
    return (
      <ul>
        {this.state.todos.map(todo => <li>{todo.text}</li>)}
      </ul>
    );
  }
}

Односторонний поток данных (Unidirectional Data Flow)

Все сущности взаимодействуют строго по круговой схеме:

  1. ViewAction: Пользовательское взаимодействие в View вызывает Action Creator.
  2. ActionDispatcher: Созданный Action отправляется (диспатчится) в центральный Dispatcher.
  3. DispatcherStore: Dispatcher передает Action всем зарегистрированным Stores.
  4. StoreView: Store обрабатывает Action, обновляет свое состояние и emits событие 'change'. View, слушающие это событие, получают новые данные и перерисовываются.

Этот цикл гарантирует, что данные никогда не изменяются "снизу" (из View) напрямую и всегда проходят через централизованный контроль Dispatcher. Это делает трассировку изменений состояния прозрачной и значительно упрощает debugging сложных приложений.

Заключение

Сущности Flux — Actions, Dispatcher, Stores и Views — образуют дисциплинированную систему с однонаправленным потоком данных. Эта архитектура стала фундаментом для более современных и популярных реализаций, таких как Redux (который упрощает Flux, объединяя Stores в единое дерево состояния и заменяя Dispatcher на чистую функцию-редукер). Понимание этих базовых сущностей критически важно для освоения современных state management библиотек в экосистеме React и за ее пределами.