All Projects → gajus → Redux Immutable

gajus / Redux Immutable

Licence: other
redux-immutable is used to create an equivalent function of Redux combineReducers that works with Immutable.js state.

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Redux Immutable

Immutable Object
🔒 Immutable object library for PHP
Stars: ✭ 87 (-95.37%)
Mutual labels:  immutable
Pyrsistent
Persistent/Immutable/Functional data structures for Python
Stars: ✭ 1,621 (-13.68%)
Mutual labels:  immutable
Floyd
The Floyd programming language
Stars: ✭ 133 (-92.92%)
Mutual labels:  immutable
Js Joda
🕑 Immutable date and time library for javascript
Stars: ✭ 1,298 (-30.88%)
Mutual labels:  immutable
Bistate
A state management library for React combined immutable, mutable and reactive mode
Stars: ✭ 113 (-93.98%)
Mutual labels:  immutable
Typed
The TypeScript Standard Library
Stars: ✭ 124 (-93.4%)
Mutual labels:  immutable
Html
A Virtual DOM based templating-engine for PHP
Stars: ✭ 86 (-95.42%)
Mutual labels:  immutable
React Copy Write
✍️ Immutable state with a mutable API
Stars: ✭ 1,810 (-3.62%)
Mutual labels:  immutable
Immutagen
A library for simulating immutable generators in JavaScript
Stars: ✭ 115 (-93.88%)
Mutual labels:  immutable
Optics Ts
Type-safe, ergonomic, polymorphic optics for TypeScript
Stars: ✭ 132 (-92.97%)
Mutual labels:  immutable
Setfield.jl
Update deeply nested immutable structs.
Stars: ✭ 90 (-95.21%)
Mutual labels:  immutable
Proposal Record Tuple
ECMAScript proposal for the Record and Tuple value types. | Stage 2: it will change!
Stars: ✭ 1,394 (-25.77%)
Mutual labels:  immutable
Apple Basket Redux
🍎 苹果篮子,一个微型的redux/mobx演示(附多版本)
Stars: ✭ 125 (-93.34%)
Mutual labels:  immutable
Imlazy
😴 Functional programming with lazy immutable iterables
Stars: ✭ 89 (-95.26%)
Mutual labels:  immutable
Monolite
Statically-typed structural-sharing tree modifier
Stars: ✭ 144 (-92.33%)
Mutual labels:  immutable
Freezer
A tree data structure that emits events on updates, even if the modification is triggered by one of the leaves, making it easier to think in a reactive way.
Stars: ✭ 1,268 (-32.48%)
Mutual labels:  immutable
React Cloud Music
React 16.8打造精美音乐WebApp
Stars: ✭ 1,722 (-8.31%)
Mutual labels:  immutable
Immudb
immudb - world’s fastest immutable database, built on a zero trust model
Stars: ✭ 3,743 (+99.31%)
Mutual labels:  immutable
Immer
Postmodern immutable and persistent data structures for C++ — value semantics at scale
Stars: ✭ 1,935 (+3.04%)
Mutual labels:  immutable
List
🐆 An immutable list with unmatched performance and a comprehensive functional API.
Stars: ✭ 1,604 (-14.59%)
Mutual labels:  immutable

redux-immutable

GitSpo Mentions Travis build status NPM version Canonical Code Style

redux-immutable is used to create an equivalent function of Redux combineReducers that works with Immutable.js state.

When Redux createStore reducer is created using redux-immutable then initialState must be an instance of Immutable.Collection.

Problem

When createStore is invoked with initialState that is an instance of Immutable.Collection further invocation of reducer will produce an error:

The initialState argument passed to createStore has unexpected type of "Object". Expected argument to be an object with the following keys: "data"

This is because Redux combineReducers treats state object as a plain JavaScript object.

combineReducers created using redux-immutable uses Immutable.js API to iterate the state.

Usage

Create a store with initialState set to an instance of Immutable.Collection:

import {
  combineReducers
} from 'redux-immutable';

import {
  createStore
} from 'redux';

const initialState = Immutable.Map();
const rootReducer = combineReducers({});
const store = createStore(rootReducer, initialState);

By default, if state is undefined, rootReducer(state, action) is called with state = Immutable.Map(). A different default function can be provided as the second parameter to combineReducers(reducers, getDefaultState), for example:

const StateRecord = Immutable.Record({
	foo: 'bar'
});
const rootReducer = combineReducers({foo: fooReducer}, StateRecord);
// rootReducer now has signature of rootReducer(state = StateRecord(), action)
// state now must always have 'foo' property with 'bar' as its default value

When using Immutable.Record it is possible to delegate default values to child reducers:

const StateRecord = Immutable.Record({
	foo: undefined
});
const rootReducer = combineReducers({foo: fooReducer}, StateRecord);
// state now must always have 'foo' property with its default value returned from fooReducer(undefined, action)

In general, getDefaultState function must return an instance of Immutable.Record or Immutable.Collection that implements get, set and withMutations methods. Such collections are List, Map and OrderedMap.

Using with react-router-redux v4 and under

react-router-redux routeReducer does not work with Immutable.js. You need to use a custom reducer:

import Immutable from 'immutable';
import {
  LOCATION_CHANGE
} from 'react-router-redux';

const initialState = Immutable.fromJS({
  locationBeforeTransitions: null
});

export default (state = initialState, action) => {
  if (action.type === LOCATION_CHANGE) {
    return state.set('locationBeforeTransitions', action.payload);
  }

  return state;
};

Pass a selector to access the payload state and convert it to a JavaScript object via the selectLocationState option on syncHistoryWithStore:

import {
  browserHistory
} from 'react-router';
import {
  syncHistoryWithStore
} from 'react-router-redux';

const history = syncHistoryWithStore(browserHistory, store, {
  selectLocationState (state) {
      return state.get('routing').toJS();
  }
});

The 'routing' path depends on the rootReducer definition. This example assumes that routeReducer is made available under routing property of the rootReducer.

Using with react-router-redux v5

To make react-router-redux v5 work with Immutable.js you only need to use a custom reducer:

import {
  Map
} from 'immutable';
import {
  LOCATION_CHANGE
} from 'react-router-redux';

const initialState = Map({
  location: null,
  action: null
});

export function routerReducer(state = initialState, {type, payload = {}} = {}) {
  if (type === LOCATION_CHANGE) {
    const location = payload.location || payload;
    const action = payload.action;

    return state
      .set('location', location)
      .set('action', action);
  }

  return state;
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].