Flux is an architecture for handling data.
Characteristics:
MVC pattern
Flux pattern
When more than one Controller modifies a Model:
Main components:
Provides a clean implementation, that is ES6 compatible.
Components:
Async handling:
import { Actions } from 'flummox';
class MessageActions extends Actions {
createMessage(messageContent) {
return {
content: messageContent,
date: Date.now(),
};
}
}
import { Store } from 'flummox';
class MessageStore extends Store {
constructor(flux) {
super(); // Don't forget this step
const messageActionIds = flux.getActionIds('messages');
this.register(messageActionIds.createMessage, this.handleNewMessage);
this.state = {
messages: [],
};
}
handleNewMessage(message) {
this.setState({
messages: this.state.messages.concat([message]),
});
}
}
import { Flux } from 'flummox';
class AppFlux extends Flux {
constructor() {
super();
this.createActions('messages', MessageActions);
// The extra argument(s) are passed to the MessageStore constructor
this.createStore('messages', MessageStore, this);
}
}
import FluxComponent from 'flummox/component';
class MessagesView extends React.Component {
render() {
return (
<FluxComponent connectToStores={{
messages: store => ({
messages: store.messages
})
}}>
// MessageList is injected with a `messages` prop by FluxContainer
<MessageList />
</FluxComponent>
);
}
}<FluxComponent flux={flux}>
// Immediate children have flux prop
</FluxComponent>
<FluxComponent>
// Same as last time: immediate children have flux prop
// flux is already part of context, and remains so
</FluxComponent>
FluxComponent:
class MyComponent extends React.Component {
constructor (props, context) {
super(props, context);
}
}
MyComponent.contextTypes = {
flux: React.PropTypes.object.isRequired
};<FluxComponent flux={flux}>
<App>
<MyComonent/>
</App>
</FluxComponent>