use-enhanced-state

A collection of enhanced useState hooks for React.

Usage no npm install needed!

<script type="module">
  import useEnhancedState from 'https://cdn.skypack.dev/use-enhanced-state';
</script>

README

🔄 use-enhanced-state

Build Status codecov Bundle size npm version

A collection of enhanced useState hooks for React.

Table of contents

Installation

npm install --save use-enhanced-state

Hooks

useControlledState

Used to sync local component state and incoming state from props. This is useful for creating controlled components, like a custom <Input />.

import React from 'react';
import { useControlledState } from 'use-enhanced-state';

const Control = ({ value: valueProp }) => {
    const [value, setValue] = useControlledState(valueProp);

    return <Input value={value} onChange={setValue} />;
};
useControlledState(initialState?: any, { initial?: any })

useControlledState has options as a second argument. initial from options can be used to set the initial value for the internal controlled state.

useListState

Used for a flat array.

import React from 'react';
import { useListState } from 'use-enhanced-state';

const ListComponent = () => {
    const [items, itemsFns] = useListState([{ id: 1 }, { id: 2 }]);

    return (
        <ul>
            {items.map((item) => (
                <li key={item.id}>{item.id}</li>
            ))}
        </ul>
    );
};

Methods

There are a handful of convenient methods provided by the second argument of useListState().

.add(data)

Alias: .append()

Adds a new item to the array (at the end).

const [items, itemsFns] = useListState([...]);

itemsFns.add({ id: 'a' });
.find({ at: number, id: any })

Alias: .get()

Finds an item from the array, using either an index value (at) or an id.

const [items, itemsFns] = useListState([...]);

itemsFns.find({ id: 'a' });
itemsFns.find({ at: 9 });
.has({ at: number, id: any })

Checks to see if the array contains an item.

const [items, itemsFns] = useListState([...]);

itemsFns.has({ id: 'a' });
.indexOf({ id: any })

Checks an index of an item based on an id.

const [items, itemsFns] = useListState([...]);

itemsFns.indexOf({ id: 'a' });
.insert({ at: number, item: any })

Adds new data an a specific index.

const [items, itemsFns] = useListState([...]);

itemsFns.insert({at: 3, item: { id: 'a' }});
.move(source: number, destination: number)

Moves an item from a previous index (source) to a new index (destination).

const [items, itemsFns] = useListState([...]);

itemsFns.move(3, 5);
.prepend(data)

Adds a new item to the array (at the start).

const [items, itemsFns] = useListState([...]);

itemsFns.prepend({ id: 'a' });
.remove({ at: number, id: any })

Removes an item from the array, given an index value (at) or an id. Alternatively, a filter match (function) can be provided.

const [items, itemsFns] = useListState([...]);

itemsFns.remove({ id: 'a' });
// or
itemsFns.remove((item) => item.id === 'a');
.removeAll((item: any, index: number) => boolean)

Removes all items from the array based on a filter match.

const [items, itemsFns] = useListState([...]);

itemsFns.removeAll((item) => item.value > 50);
.set(Array | Function)

Alias: .setState()

The original React setState callback from useState.

const [items, itemsFns] = useListState([...]);

itemsFns.set([{ id: 'a' }]);
.update(Object)

Updating an item based on an id match.

const [items, itemsFns] = useListState([...]);

itemsFns.update({ id: 'a', title: 'b' });

useBoolState

Used for a boolean state.

import React from 'react';
import { useListState } from 'use-enhanced-state';

const ListComponent = () => {
    const [show, showData] = useBoolState(false);

    return <div>{show ? 'Show' : 'Hide'}</div>;
};

Methods

There are a handful of convenient methods provided by the second argument of useBoolState().

.true()

Alias: .truthy()

Sets the value to true.

const [value, valueFns] = useBoolState(false);

valueFns.true();
.false()

Alias: .falsy()

Sets the value to false.

const [value, valueFns] = useBoolState(true);

valueFns.false();
.toggle()

Toggles the value between true and false.

const [value, valueFns] = useBoolState(true);

valueFns.toggle();
.set(Array | Function)

Alias: .setState()

The original React setState callback from useState.

const [value, valueFns] = useBoolState(false);

valueFns.set(true);

useLocalState

Used to read/write state to localStorage.

import React from 'react';
import { useListState } from 'use-enhanced-state';

const ListComponent = () => {
    const [config, setConfig] = useLocalState('items', {...});

    return (
        <div>{config.dark ? 'Dark' : 'Light'}</div>
    );
};
useLocalState(key: string, state: any)

The key will be used as the localState key for your data.