Methodes

constructor({ns:String, intialState:Object})

  /**
   * Create an RxStore instance
   * @param {Object} opts
   * @param {String} opts.ns The namespace of the store. Debuggin purpose. Default: 'rxStore'
   * @param {Object} opts.initialState Initial state of the store. Default: {}
   * 
   * @returns {RxStore} A new RxStore instance
   */
   constructor({ ns = 'rxStore', initialState = {} } = {})

Example

todo.store.js

import RxStore from '@zazapeta/rx-react-store';

const ns = 'Todo';
const initialState = {
  todos: []
};

const todoStore = new RxStore({ ns, initialState });

export default todoStore;

async dispatch(reducer:Function, ...rest)

  /**
   * Async Method
   * Dispatch a reducer thought the store. This the unique manner to modify the store.
   * @param {Function(Object,...rest)} action The reducer to be dispatched, that will modify the store.
   * Action got the state of the store as first arguments and 'rest' next.
   * @param {*} rest Rest of arguments passed to middlewares and to the action.
   */
   async dispatch(reducer = (state) => state, ...rest)

Define dispatchers in a dedicated file. Just import todoStore and have access to the dispatch method to update all connected component.

todo.dispatchers.js

import todoStore from './todo.store.js';

export async function handleRemoveTodo(todo){
  return todoStore.dispatch((state) => ({
    ...state, 
    todos: state.todos.filter((t) => t.id !== todo.id)
  }));
}

createDispatcher(reducer:Function): Function

RxStore provide createDispatcher method to avoid repetitive code.

  createDispatcher(reducer) {
    return (...args) => this.dispatch(reducer, ...args);
  }

Define reducers in a dedicated file.

todo.reducers.js

export function addTodo(state, todo){
  return {
    ...state,
    todos: state.todos.concat(todo)
  };
}

todo.container.jsx

import todoStore from './todo.store.js';
import { addTodo } from './todo.reducers.js';
let handleAddTodo = todoStore.createDispatcher(addTodo);

/* Equivalent to :
function handleTodo(todo){
  return todoStore.dispatch(addTodo, todo);
}
*/
...

onClick={() => handleAddTodo(todo)}

createDispatchers(reducersMap:Object{String,Function}):Object{String, Function}

RxStore provide createDispatchers method to avoid repetitive code.

  createDispatchers(reducers = {}) {
    let dispatchers = {};
    Object.keys(reducers).forEach(
      (reducer) =>
        (dispatchers[reducer] = this.createDispatcher(reducers[reducer])),
    );
    return dispatchers;
  }

Define reducers in a dedicated file.

todo.reducers.js

export function addTodo(state, todo){
  return {
    ...state,
    todos: state.todos.concat(todo)
  };
}

todo.container.jsx

import todoStore from './todo.store.js';
import * as reducers from './todo.reducers.js';
let dispatchers = todoStore.createDispatchers(reducers);

...

onClick={() => dispatchers.addTodo(todo)}

connect(mapStateToProps:Function(state, props)->Object)(BaseComponent:Component):Component

connect is a High Order Component (react-redux.connect). It's create a component that listen for changes comming from the given store.

TIPS: To integrate RxStore with another view library, you may override connect

todo.container.jsx

import todoStore from './todo.store.js';

function TodoContainer({todos}){
...
}

function mapStateToProps({ todos }, props) {
  // Work very well with 'reselect'.
  let _todos = todos.sort((t1, t2) => t1.id < t2.id);

  return { todos: _todos };
}

export default todoStore.connect(mapStateToProps)(TodoContainer);

Last updated