cheatsheets/flux.md

2.6 KiB

title layout
Flux default

Architecture

  • Dispatchers receive actions that get dispatched to its listeners.

  • Stores are objects that store data, usually changed from a dispatcher listener.

  • Views are React components that listen to Store changes, or emit actions to the dispatcher.


Dispatcher

A dispatcher emits events (.dispatch()) to its listeners (.register(fn)).

var Dispatcher = require('flux').Dispatcher;

d = new Dispatcher();

// send a payload
d.dispatch({ a: 'aaa', ... };

// receive payloads
token = d.register(function (payload) {
  payload.a === 'aaa'
})

Ensuring proper order

You can ensure one listener is fired after another using .waitFor().

token1 = d.register(...);

token2 = d.register(function (payload) {

  // ensure receiver 1 is fired before this
  d.waitFor([ token1 ]);
  
  // process here
})

Subclassing

Object.assign is the preferred way to subclass Dispatcher (think $.extend).
You can also make action creators, which are shortcuts for dispatch().

var Dispatcher = require('flux').Dispatcher;
var assign = require('object-assign');

var AppDispatcher = assign({}, Dispatcher.prototype, {

  // action creator
  handleViewAction(action) {
    this.dispatch({
      source: 'VIEW_ACTION',
      action: action
    })
  } 

})

Stores

Stores are just like objects.

var TodoStore = { todos: {} };

Events

Sometimes they're eventemitters, too.

var TodoStore = assign({}, EventEmitter.prototype, {
  ...
});

TodoStore.emit('change');
TodoStore.on('change', function () { ... });

Model logic

Logic can sometimes belong in stores.

{
  isAllActive() {
    return this.list.every(item => item.active);
  }
}

Stores and dispatchers

Make a Dispatcher and Stores.

d = new Dispatcher();
TabStore = { tab: 'home' };

Updating data

Dispatch events to alter the store.

d.dispatch({ action: 'tab.change', tab: 'timeline' });

d.register(function (data) {
  if (data.action === 'tab.change') {
    TabStore.tab = data.tab;
  }
});

With Views

Components can listen to Dispatchers.

var TodoApp = React.createClass({

  componentDidMount() {
    this.token = AppDispatcher.register(function (payload) {
      switch (payload.action) {
        case 'tab.change':
          // ...
      }
    });
  }
  
});

Also see