1.25.0 • Published 4 years ago

oo-redux-utils v1.25.0

Weekly downloads
1
License
MIT
Repository
github
Last release
4 years ago

Object-oriented Redux Utils

Get rid of switch-cases in your code by using object-oriented Redux Utils!

Read article: Replace using conditionals with Polymorphism

version build coverage MIT License

Prerequisites

"react": "^16.0.0",
"react-redux": "^6.0.0",
"redux": "^4.0.1"
"flow-bin": "^0.105.0"

Installation

npm install --save oo-redux-utils

Usage

Create Object-oriented action

Create a new Object-oriented action by creating a class for action that extends AbstractAction<StateType> Then implement performActionAndReturnNewState method

PersonState.js

// @flow

export type PersonState = $Exact<{
    +name: string,
    +age: number
}>;

personStateReducer.js

// @flow

import OOReduxUtils from 'oo-redux-utils';
import type { PersonState } from './PersonState';

const initialPersonState: PersonState = {
    name: '',
    age: 0
}

export default OOReduxUtils.createStateReducer(initialPersonState, AbstractAction<PersonState>)

ModifyPersonAgeAction.js

// @flow

import { AbstractAction } from 'oo-redux-utils';
import type { PersonState } from './PersonState';
    
export default class ModifyPersonAgeAction extends AbstractAction<PersonState> {
  newAge: number;

  constructor(newAge: number) {
    super();
    this.newAge = newAge;
  }

  performActionAndReturnNewState(currentState: PersonState): PersonState {
    return {
      ...currentState,
      age: this.newAge
    };
  }
}

Create app state type

AppState.js

// @flow

import type { PersonState } from './PersonState';

export type AppState = $Exact<{
    personState: PersonState
}>;

Create state store

store.js

// @flow

import { createStore, combineReducers } from 'redux';
import type { Action, Store } from 'redux';
import type { AppState } from AppState';

const appStateReducer: (AppState | void, Action<AbstractAction<any>>) => AppState = combineReducers({
    personState: personStateReducer;
});

export default (createStore(
  appStateReducer,
  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
): Store<AppState, Action<AbstractAction<any>>);

Use person state in React component

PersonComponent.js

// @flow

import React from 'react';
import { connect } from 'react-redux';
import OOReduxUtils, { AbstractComponent } from 'oo-redux-utils';
import type { DispatchWrapper } from 'oo-redux-utils';
import ModifyPersonAgeAction from './ModifyPersonAgeAction';

type MappedState = PersonState;
    
const mapAppStateToComponentProps = (appState: AppState): MappedState
    => OOReduxUtils.mergeOwnAndForeignState(appState.personState, {});

type OwnProps = {};
type Props = $Exact<{ ...MappedState, ...DispatchWrapper };

class PersonComponent extends AbstractComponent<Props, {}> {
    
    modifyPersonAge = (newAge: number) => {
        this.dispatchAction(new ModifyPersonAgeAction(newAge));
    };
    
    .
    .
    
    render() {
        .
        <ComponentXYZ.... onChange={this.modifyPersonAge} ... />
        .
    }
}

export default connect<Props, OwnProps, _, _, _, _>(mapAppStateToComponentProps)(PersonComponent);  

Full example

See oo-redux-utils-flow-test-app

License

MIT License

1.25.0

4 years ago

1.24.1

4 years ago

1.24.0

4 years ago

1.23.13

4 years ago

1.23.12

4 years ago

1.23.11

4 years ago

1.23.10

4 years ago

1.23.9

4 years ago

1.23.8

4 years ago

1.23.7

4 years ago

1.23.6

4 years ago

1.23.5

4 years ago

1.23.4

4 years ago

1.23.3

4 years ago

1.23.2

4 years ago

1.23.1

4 years ago

1.23.0

4 years ago

1.22.0

4 years ago

1.21.2

4 years ago

1.21.1

4 years ago

1.21.0

4 years ago

1.20.0

4 years ago

1.19.0

4 years ago

1.18.0

4 years ago

1.17.0

4 years ago

1.16.0

4 years ago

1.15.1

4 years ago

1.14.0

4 years ago

1.12.0

4 years ago

1.15.0

4 years ago

1.13.0

4 years ago

1.11.5

4 years ago

1.11.4

4 years ago

1.11.3

4 years ago

1.11.2

4 years ago

1.11.1

4 years ago

1.11.0

4 years ago

1.10.1

5 years ago

1.10.0

5 years ago

1.9.1

5 years ago

1.9.0

5 years ago

1.8.11

5 years ago

1.8.10

5 years ago

1.8.9

5 years ago

1.8.8

5 years ago

1.8.7

5 years ago

1.8.6

5 years ago

1.8.5

5 years ago

1.8.4

5 years ago

1.8.3

5 years ago

1.8.2

5 years ago

1.8.1

5 years ago

1.8.0

5 years ago

1.7.0

5 years ago

1.6.0

5 years ago

1.5.7

5 years ago

1.5.6

5 years ago

1.5.5

5 years ago

1.5.4

5 years ago

1.5.3

5 years ago

1.5.2

5 years ago

1.5.1

5 years ago

1.5.0

5 years ago

1.4.1

5 years ago

1.4.0

5 years ago

1.3.3

5 years ago

1.3.2

5 years ago

1.3.1

5 years ago

1.3.0

5 years ago

1.2.3

5 years ago

1.2.2

5 years ago

1.2.1

5 years ago

1.2.0

5 years ago

1.1.2

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago