1.0.1 • Published 6 years ago

zima-reducer v1.0.1

Weekly downloads
10
License
MIT
Repository
github
Last release
6 years ago

zima-reducer

zima-reducer extends React's useReducer hook by uniting the action types with the reduce function whilst providing an intuitive interface to call the dispatch method.

Example

Consider the following component:

import * as React from 'react';

type State = {
    value: number;
    enabled: boolean;
}

type ChangeValueAction = {
    kind: 'changeValue';
    value?: number;
}

type ToggleAction = {
    kind: 'toggle';
}

type Action = ChangeValueAction | ToggleAction;

function reducer(state: State, action: Action) {
    switch (action.kind) {
        case 'changeValue':
            return { ...state, value: action.value || 0 };
        case 'toggle':
            return { ...state, enabled: !state.enabled };
        default:
            return state;
    }
}

export const ExampleComponent: React.FunctionComponent = () => {
    const [state, dispatch] = React.useReducer(reducer, { value: 1, enabled: false } as State);

    return (<>
        <input
            disabled={!state.enabled}
            type='number'
            value={state.value}
            onChange={(evt) => dispatch({ kind: 'changeValue', value: evt.target.valueAsNumber })} />
        <button onClick={() => dispatch({ kind: 'toggle' })}>{state.enabled ? 'Disable' : 'Enable'}</button>
    </>)
};

Using zima-reducer this can be rewritten:

import * as React from 'react';
import zimaReducer from 'zima-reducer';

type State = {
    value: number;
    enabled: boolean;
}

const actions = {
    changeValue: (state: State, value?: number) => ({ ...state, value: value || 0 }),
    toggle: (state: State) => ({ ...state, enabled: !state.enabled })
}

export const ExampleComponent: React.FunctionComponent = () => {
    const [state, dispatch] = zimaReducer(actions, { value: 1, enabled: false } as State);

    return (<>
        <input
            disabled={!state.enabled}
            type='number'
            value={state.value}
            onChange={(evt) => dispatch.changeValue(evt.target.valueAsNumber)} />
        <button onClick={() => dispatch.toggle()}>{state.enabled ? 'Disable' : 'Enable'}</button>
    </>)
};

The zima-reducer variant improves legibility and maintainability, reduces boilerplate and eliminates the possibility of forgetting cases in the switch-clause.

1.0.1

6 years ago

1.0.0

6 years ago