react-udeo icon indicating copy to clipboard operation
react-udeo copied to clipboard

React bindings for Udeo

react-udeo (experimental)

React bindings for Udeo

Provides:

  • A Connector to connect React components to the Udeo store
  • A Provider (ala Redux) to provide the Udeo store to the connected components

Install

NOTE: This has peer dependencies of [email protected].* and React 0.14 or later

npm install --save react-udeo

Connector

Basic Usage

Subscribing to a single state stream:

import { Connector } from 'react-udeo';
import React from 'react';

class Finder extends React.Component {
  render() {
    ...
  }
}

export default new Connector(Finder)
  // Subscribe to single module's state stream
  .withStateFrom('finder')
  // By default will clear module's state on unmount
  .build();

Only mapping the store's dispatch to props (no state stream subscription):

export default new Connector(SearchBox)
   // Map the store's dispatch to props 
  .mapDispatchTo(
    dispatch => ({
      onSearch(query) {
        dispatch({ type: 'SEARCH', payload: query });
      }
    })
  )    
  .build();

More Advanced Usage

Subscribing to multiple state streams and selectively clearing state on unmount:

export default new Connector(Finder)
  // Subscribe to multiple state streams
  .withStateFrom('finder', 'shoppingCart')
  // Map the state from multiple modules to props
  .mapStateTo(
    (finderState, cartState) => ({
      ...finderState,
      totalCost: cartState.totalCost,
    })
  )
  // Map the store's dispatch to props 
  .mapDispatchTo(
    dispatch => ({
      onSearch(query) {
        dispatch({ type: 'SEARCH', payload: query });
      }
    })
  )
  // Specify what to do with the state when component unmounts
  .clearStateOnUnmount({
    finder: true,
    shoppingCart: false,
  })
  .build();

Hydrating the state stream with computed props:

export default new Connector(AvailabilityChecker)
  .withStateFrom('availability')
  .hydrateWith(
    props => ({
      availability: {
        arrival: props.vacationStartDate,
        departure: new Moment(props.vacationStartDate).add(3, 'days')
      }
    }) 
  )
  .build();

Provider

import React from 'react';
import { render } from 'react-dom';
import App from './components/App';
import { createStore } from 'udeo';
import { Provider } from 'react-udeo';
...

const store = createStore(...);

render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);