UNPKG

redux-restate

Version:

<div align="center"> <h1>redux-restate</h1> <br/> <img src="https://cdn.rawgit.com/theKashey/restate/1d67d86d/images/logo.svg" alt="restate" width="600" align="center"> <br/> <br/> Restate base layer. <br/> <br/> <a href="https://circlec

120 lines (80 loc) 3.33 kB
<div align="center"> <h1>redux-restate</h1> <br/> <img src="https://cdn.rawgit.com/theKashey/restate/1d67d86d/images/logo.svg" alt="restate" width="600" align="center"> <br/> <br/> Restate base layer. <br/> <br/> <a href="https://circleci.com/gh/theKashey/restate/tree/master"> <img src="https://img.shields.io/circleci/project/github/theKashey/restate/master.svg?style=flat-square)" alt="Build status"> </a> <br/> </div> > (a part of [restate](https://github.com/theKashey/restate) project) The base layer for redux composition. ## The problem As long React spreads component architecture and highly composable patterns, the major part of it - Redux - do not follow this way. In the world of redux **Store is a singlentone**. You can create a connection to that store, and fetch the data you need. But how? `Redux is the same for any connection, created from any point of Render Tree.` You have to use React props, to pass the `ids` you need deeply into react Tree to use them to get the data out of the store. Redux is not composable. Redux is not component friendly. ## The borders Redux's connect method produces PureComponent. No update from the top will pass PureComponent. All updates will start from PureComponent. `Connect is the end for all updates, and the beginning.` Then you will change the store, **all** connected component will be triggered to update. They will mapStateToProps and **maybe** do nothing more, in case the result object is shallowEqual to the older one. Unless you will specify `areStatesEqual` for each connect, which is not quite possible, to say the truth. ## The solution Redux-restate get: * one or more stores as input, * combine function to create a new store * dispatch function, to handle dispatch And produces the new store. Thus makes redux composable, and enabled the component way. ## The implementation * redux-restate for redux level. * react-redux-retate for react multy-state case. * react-redux-focus for single store case. ## Usage ### redux-restate ```js import restate from 'redux-restate'; const newStore = restate({ store: baseStore }, composeState, routeDispatch, options); ``` #### composeState get one one more `states` as input, produce the output #### routeDispatch get one one more dispatch as input, then call the disired one with even, also provided. ### react-redux-restate ```js import reactReduxRestate from 'react-redux-restate'; const RestatedComponent = reactReduxRestate( { otherStore: otherStore }, (stores, props) => composeState, (dispatchers, event, props) => routeDispatch, options, )(WrappedComponent); ``` The same as redux-restate, but in form of React HOC. The default store, accessible with storeKey, is available as .default for next functions. #### composeState get one one more `states` as input, plus props, produce the output #### routeDispatch get one one more dispatch as input, plus props, then call the disired one with even, also provided. ### react-redux-focus ```js import reactReduxFocus from 'react-redux-focus'; const FocusedComponent = reactReduxFocus( (state, props) => state.todos[props.id], (dispatch, event, props) => dispatch({ ...event, id: props.id }), )(WrappedComponent); ``` The same as react-redux-restate, but for a single store. ## Licence MIT