reflux-state-mixin
Mixin for reflux stores to enable them to have state
, setState()
, storeDidUpdate()
and getInitialState()
, similar to React components.
Usage
in store:
var Reflux = require('reflux');
var StateMixin = require('reflux-state-mixin')(Reflux);
var Actions = require('./../actions/AnimalsActions');
var AnimalStore = module.exports = Reflux.createStore({
mixins: [StateMixin],
listenables: Actions,
getInitialState(){
return{
dogs:5,
cats:3
}
},
onNewDogBorn: function() {
this.setState({dogs: this.state.dogs + 1})
},
storeDidUpdate: function(prevState) {
if(this.state.dogs !== prevState.dogs){
console.log('number of dogs has changed!');
}
}
});
in component:
1:
var AnimalStore = require('./AnimalStore.js');
var DogsComponent = React.createClass({
mixins:[Reflux.ListenerMixin],
getInitialState: function (){
return({
dogs:AnimalStore.state.dogs
})
},
componentDidMount: function(){
this.listenTo(AnimalStore.dogs,this.updateDogs);
},
updateDogs: function(dogs){
this.setState({dogs:dogs});
},
render: function () {
return (<div><p>We have {this.state.dogs} dogs</p></div>);
}
});
2. listen to an entire store:
var AnimalStore = require('./AnimalStore.js');
var PetsComponent = React.createClass({
mixins:[Reflux.ListenerMixin],
getInitialState: function (){
return({
dogs: AnimalStore.state.dogs,
cats: AnimalStore.state.cats
})
},
componentDidMount: function(){
this.listenTo(
AnimalStore,
(state)=>{
this.setState({
dogs:state.dogs,
cats:state.cats
})
});
},
render: function () {
return (<div><p>We have {this.state.dogs + this.state.cats} pets</p></div>);
}
})
3. connect:
var AnimalStore = require('./AnimalStore.js');
var StateMixin = require('reflux-state-mixin')(Reflux);
var PetsComponent = React.createClass({
mixins:[
StateMixin.connect(AnimalStore, 'dogs')
StateMixin.connect(AnimalStore)
],
render: function () {
return (<div><p>We have {this.state.dogs} dogs</p></div>);
}
})
Installation
$ npm install reflux-state-mixin --save
some details
GetInitialState()
in store should have all of the states from the beginning.
setState()
is checking to see if there is a difference between new state.key
from current state.key
. If not, this specific state.key
it's not triggering.
For any setState()
the entire store is triggering (regardless of changes), allowing any Component or other Store to listen to the entire Store's state.
acknowledgments
This mixin is combination of two other mixins -
triggerables-mixin, a really useful mixin for controlling the trigger of the stores. Also see this for details.
And state-mixin
I thank @jehoshua02 and @jesstelford for their valuable code.