A reimplementation of redux using RxJS.
A reimplementation of redux using RxJS.
Reactive by default, this makes difference.
If you just want to use redux with RxJS and don't care about API compatibility, see redux-core.
storeprovides 2 rx objects you can utilize:
dispatcher$is a Subject that you can pass actions in.
state$is an Observable, a stream of states.
connectActionto stream actions to store (see example below).
import {createStore, combineReducers, applyMiddleware, connectAction} from 'rx-redux' import thunkMiddleware from 'redux-thunk' import * as reducers from './reducers' import { render, getActionStream } from './view'const action$ = getActionStream();
const newCreateStore = applyMiddleware(thunkMiddleware)(createStore); const reducer = combineReducers(reducers); const store = newCreateStore(reducer);
// stream states to view store.state$.subscribe(state => render(state));
// stream actions to dispatcher action$.subscribe(action => store.dispatcher$.onNext(action)); // or you can write this way // connectAction(action$, store);
Don't do async in
Middleware, create
RxMiddlewareinstead.
This will ease the pain to build universal apps.
Which wraps action stream, look like this: ```javascript import Rx from 'rx';
export default function thunkMiddleware(getState) { return action => { if(typeof action === 'function') { return Rx.Observable.just(action(getState)); }
// Don't know how to handle this thing, pass to next rx-middleware return Rx.Observable.just(action);
}; }
How to design `RxMiddleware` - Get action, return [Observable](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md). - **Must** return Observable. - If you don't want to return an action (eg. if counter is not odd), return a Rx.Observable.empty().See a basic RxMiddleware example
WIP
> Feel free to ask questions or submit pull requests!