mirror of
https://github.com/streamich/react-use.git
synced 2026-01-18 14:06:52 +00:00
Merge pull request #592 from Granipouss/feat-memoized-useMap
Memoized utils methods for useMap
This commit is contained in:
commit
4fc2e3631b
@ -106,3 +106,16 @@ it('should reset map to initial object provided', () => {
|
||||
|
||||
expect(result.current[0]).toEqual({ foo: 'bar', a: 1 });
|
||||
});
|
||||
|
||||
it('should memoized its utils methods', () => {
|
||||
const { result } = setUp({ foo: 'bar', a: 1 });
|
||||
const [, utils] = result.current;
|
||||
const { set } = utils;
|
||||
|
||||
act(() => {
|
||||
set('foo', 'baz');
|
||||
});
|
||||
|
||||
expect(result.current[1]).toBe(utils);
|
||||
expect(result.current[1].set).toBe(set);
|
||||
});
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { useState } from 'react';
|
||||
import { useState, useMemo } from 'react';
|
||||
|
||||
export interface Actions<T extends object> {
|
||||
get: <K extends keyof T>(key: K) => T[K];
|
||||
@ -10,25 +10,27 @@ export interface Actions<T extends object> {
|
||||
const useMap = <T extends object = any>(initialMap: T = {} as T): [T, Actions<T>] => {
|
||||
const [map, set] = useState<T>(initialMap);
|
||||
|
||||
return [
|
||||
map,
|
||||
{
|
||||
get: (key: keyof T) => map[key as string],
|
||||
set: <K extends keyof T>(key: K, entry: T[K]) => {
|
||||
const utils = useMemo<Actions<T>>(
|
||||
() => ({
|
||||
get: key => map[key],
|
||||
set: (key, entry) => {
|
||||
set(prevMap => ({
|
||||
...prevMap,
|
||||
[key]: entry,
|
||||
}));
|
||||
},
|
||||
remove: (key: keyof T) => {
|
||||
remove: key => {
|
||||
set(prevMap => {
|
||||
const { [key]: omit, ...rest } = prevMap;
|
||||
return rest as T;
|
||||
});
|
||||
},
|
||||
reset: () => set(initialMap),
|
||||
},
|
||||
];
|
||||
}),
|
||||
[set]
|
||||
);
|
||||
|
||||
return [map, utils];
|
||||
};
|
||||
|
||||
export default useMap;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user