If we use react state in react-hooks, code tends to be long and compilicated for updating data-structure.
This package make your code simplly for update data-structure state.
This package support following data structure.
- Array
- Queue
- Set
- Map
$ npm install react-structured-statehttps://react-structured-state.web.app
Source code of Demo App is here
import { useArray } from 'react-structured-state';
const App = (): JSX.Element => {
const [arr, actionArr] = useArray<number>([1, 2, 3]);
return (
...
)
}import { atom } from 'recoil';
import { useRecoilArray } from 'react-structured-state';
export const arrayState = atom({
key: 'arrayState',
default: [1, 2, 3],
});
const App = (): JSX.Element => {
const [arr, actionArr] = useRecoilArray<number>(arrayState);
return (
...
)
}// Before
setArr((oldarr) => [...oldarr, 10]);
// After
actionArr.pushBack(10);// Before
setArr((oldarr) => oldarr.map((e) => e * 2));
// After
actionArr.map((e) => e * 2);useArray/useRecoilArray/useQueue/useRecoilQueue return two values.
First value is used for view data.
Second value is object of action methods used for changing value.
In this sction, T mean type of container.
Define action by following.
// with normal state
const [arr, actionArr] = useArray<number>([1, 2, 3]);
// with recoil state
const [arr, actionArr] = useRecoilArray<number>(arrayState);In this case, methods of actionArr are following.
| method | action | args | args(optional) | default |
|---|---|---|---|---|
| setState | basic setState | T[] | ||
| pushBack | add value(s) on back | val: T | ...vals: T[] | none |
| pushFront | add value(s) on front | val: T, | ...vals: T[] | none |
| insert | insert value | idx: number, val: T | ...vals: T[] | none |
| popBack | remove value(s) on back | count: number | 1 | |
| popFront | remove value(s) on front | count: number | 1 | |
| concatBack | add elements of array on back | vals: T[] | ||
| concatFront | add elements of array on front | vals: T[] | ||
| sort | sort with callback | fn: (vals: T[]) => T[] | (a, b) => a - b | |
| reverse | reverse elements | |||
| slice | update values with slice() | start:number, end:number | 0, length | |
| splice | update values with splice() | start:number | deleteCount: number, ...vals: T[] | none, none |
| filter | update values with filter() | fn:(vals: T[]) => boolean | ||
| map | update values with map() | fn:(vals: T[]) => T[] | ||
| fill | update values with fill() | val: T | start: number, end:number | 0, length |
| chain | update vlues with array method chain | fn: (vals:T[]) => T[] | ||
| set | set value on specified index | idx:number, val: T | ||
| erase | erase element by specified value | val:T | ||
| clear | clear all elements |
Actually, Queue implementation in this library is alias of Array methods. So you can use useArray like quque.
But if you use useQueue, you can only use few methods. So you can write code that easy to understand (by expressly Queue).
Define action by following.
// actual type of state is Array
// with normal state
const [que, actionQue] = useQueue<number>([1, 2, 3]);
// with recoil state
const [que, actionQue] = useRecoilQueue<number>(queueState);In this case, methods of actionQue are following.
| method | action | args | args(optional) | default |
|---|---|---|---|---|
| setState | basic setState | T[] | ||
| push | add value(s) on back | val: T | ...vals: T[] | none |
| pop | remove value(s) on front | count: number | 1 | |
| concat | add elements of array on back | vals: T[] | ||
| clear | clear all elements |
// with normal state
const [st, actionSt] = useSet<number>([1, 2, 3]);
// with recoil state
const [st, actionSt] = useRecoilSet<number>(stState);In this case, methods of actionSt are following.
| method | action | args | args(optional) | default |
|---|---|---|---|---|
| setState | basic setState | Set | ||
| add | add key(s) | val: T | ...vals: T[] | none |
| delete | delete key | val:T | ||
| clear | clear set |
// with normal state
const [mp, actionMp] = useMap<string, number>([['a', 1]]);
// with recoil state
const [mp, actionMp] = useRecoilMap<string, number>(mpState);In this case, methods of actionSt are following.
TK means type of key, TV means type of value.
| method | action | args | args(optional) | default |
|---|---|---|---|---|
| setState | basic setState | Map<TK,TV> | ||
| set | add or update key/val | key: TK, val: TV | ||
| delete | delete key/val | key:TK | ||
| clear | clear all key/val |