UNPKG

1.21 kBJavaScriptView Raw
1import useForceUpdate from './useForceUpdate';
2import useStableMemo from './useStableMemo';
3export class ObservableSet extends Set {
4 constructor(listener, init) {
5 super(init);
6 this.listener = listener;
7 }
8 add(value) {
9 super.add(value);
10 // When initializing the Set, the base Set calls this.add() before the
11 // listener is assigned so it will be undefined
12 if (this.listener) this.listener(this);
13 return this;
14 }
15 delete(value) {
16 const result = super.delete(value);
17 this.listener(this);
18 return result;
19 }
20 clear() {
21 super.clear();
22 this.listener(this);
23 }
24}
25
26/**
27 * Create and return a [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) that triggers rerenders when it's updated.
28 *
29 * ```ts
30 * const ids = useSet<number>([1,2,3,4]);
31 *
32 * return (
33 * <>
34 * {Array.from(ids, id => (
35 * <div>
36 * id: {id}. <button onClick={() => ids.delete(id)}>X</button>
37 * </div>
38 * )}
39 * </>
40 * )
41 * ```
42 *
43 * @param init initial Set values
44 */
45function useSet(init) {
46 const forceUpdate = useForceUpdate();
47 return useStableMemo(() => new ObservableSet(forceUpdate, init), []);
48}
49export default useSet;
\No newline at end of file