ReactPersistentState
is a mixin, which allows saving the current state of ReactJS component. It provides predefined persistent storage, which uses localStorage
. The storage has asynchronous interface in order to provide functionality for saving the state using XHR, WebSockets, etc.
If you want to use your own storage, just implement the interface described in the next section.
DEMO.
Each component should have an id
. Note that you must provide component unique id. A good way to generate one might be to get css
or xquery
selector.
set(id, data)
- Sets value of for givenid
.data
is an object, so serialization might be required inside the implementation ofset
. This method should return a promise.get(id)
- Gets value by givenid
. This method must return a promise, which should be resolved with deserialized data.remove(id)
- Removes the data associated to givenid
. This method should return a promise.
The mixin uses the ECMAScript 6 Promise API. Polyfill is available here.
setPId(id)
- Sets the componentid
. This method must be invoked before any other.setPStorage(storage)
- Sets the storage, which should be used for storing the component's state.setPState(state, cb)
- Sets the persistent state of the component. This method is wrapper of the defaultsetState
. Initially it invokessetState
, once the state has been set successfully the save logic associated with the usedstorage
will be invoked.cb
will be invoked once the state has been successfully set (i.e. invoked inside the callback passed tosetState
).removePState()
- Removes the saved persistent state.restorePState(cb)
- Restores the persistent state of the component. Once the returned promise by theget
method of the used storage has been resolved the mixin will invokesetState
with the received value.cb
will be invoked once the state has been successfully set.
var TickLabel = React.createClass({
mixins: [ReactPersistentState],
componentDidMount: function () {
'use strict';
var self = this;
this.setPId('unique_id');
this.setPStorage(this.localStorage);
setInterval(function () {
self.setPState({
ticks: self.state.ticks + 1
});
}, 1000);
this.restorePState();
},
getInitialState: function () {
'use strict';
return { ticks: 0 };
},
render: function () {
'use strict';
return React.createElement('div', {}, this.state.ticks);
}
});
React.render(TickLabel(), document.getElementById('content'));
After refresh the TickLabel
will continue ticking from the value it had before the page was refreshed.
MIT