@jelper/hooks 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -31
- package/es/index.js +25 -1779
- package/es/useAsync.js +73 -0
- package/es/useBoolState.js +23 -0
- package/es/useCreate.js +11 -0
- package/es/useDebounce.js +18 -0
- package/es/useIgnoreAbortErrCb.js +16 -0
- package/es/useInterval.js +29 -0
- package/es/useIsMounted.js +18 -0
- package/es/useIsUnmounted.js +17 -0
- package/es/useMount.js +11 -0
- package/es/useOption.js +19 -0
- package/es/useResizeObserver.js +50 -0
- package/es/useRtCb.js +15 -0
- package/es/useRtRef.js +13 -0
- package/es/useSafeRunner.js +20 -0
- package/es/useThrottle.js +18 -0
- package/es/useTimeout.js +29 -0
- package/es/useUnmount.js +17 -0
- package/es/useUpdateEff.js +17 -0
- package/es/useValue.js +29 -0
- package/lib/index.js +48 -1773
- package/lib/useAsync.js +90 -0
- package/lib/useBoolState.js +25 -0
- package/lib/useCreate.js +13 -0
- package/lib/useDebounce.js +27 -0
- package/lib/useIgnoreAbortErrCb.js +19 -0
- package/lib/useInterval.js +35 -0
- package/lib/useIsMounted.js +20 -0
- package/lib/useIsUnmounted.js +19 -0
- package/lib/useMount.js +13 -0
- package/lib/useOption.js +33 -0
- package/lib/useResizeObserver.js +53 -0
- package/lib/useRtCb.js +25 -0
- package/lib/useRtRef.js +15 -0
- package/lib/useSafeRunner.js +25 -0
- package/lib/useThrottle.js +27 -0
- package/lib/useTimeout.js +35 -0
- package/lib/useUnmount.js +22 -0
- package/lib/useUpdateEff.js +19 -0
- package/lib/useValue.js +34 -0
- package/package.json +13 -5
- package/types/index.d.ts +8 -10
- package/types/useAsync.d.ts +22 -8
- package/types/useBoolState.d.ts +7 -1
- package/types/useCreate.d.ts +7 -1
- package/types/useDebounce.d.ts +6 -0
- package/types/useIgnoreAbortErrCb.d.ts +12 -0
- package/types/useInterval.d.ts +4 -1
- package/types/useIsMounted.d.ts +8 -0
- package/types/useIsUnmounted.d.ts +8 -0
- package/types/useMount.d.ts +7 -1
- package/types/useOption.d.ts +15 -0
- package/types/useRtCb.d.ts +8 -1
- package/types/useRtRef.d.ts +8 -1
- package/types/useSafeRunner.d.ts +8 -0
- package/types/useThrottle.d.ts +5 -6
- package/types/useTimeout.d.ts +8 -5
- package/types/useUnmount.d.ts +7 -1
- package/types/useUpdateEff.d.ts +8 -0
- package/types/useValue.d.ts +8 -0
- package/types/useIsUnmount.d.ts +0 -2
- package/types/useListener.d.ts +0 -2
- package/types/useParamsState.d.ts +0 -6
- package/types/useRtEffect.d.ts +0 -2
- package/types/useRtState.d.ts +0 -6
- package/types/useSafeCb.d.ts +0 -2
- package/types/useSafeState.d.ts +0 -3
- package/types/useUpdateEffect.d.ts +0 -1
package/es/useAsync.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-18 23:44:38
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 22:53:22
|
|
6
|
+
*/
|
|
7
|
+
import { useEffect, useState } from 'react';
|
|
8
|
+
import useRtCb from './useRtCb';
|
|
9
|
+
import useCreate from './useCreate';
|
|
10
|
+
import useIsUnmounted from './useIsUnmounted';
|
|
11
|
+
import useUnmount from './useUnmount';
|
|
12
|
+
const defOpt = {
|
|
13
|
+
immediate: false,
|
|
14
|
+
catchParam: false,
|
|
15
|
+
};
|
|
16
|
+
const useAsync = (asyncFn, opt = defOpt) => {
|
|
17
|
+
const [data, setData] = useState();
|
|
18
|
+
const [param, setParam] = useState(opt.defParam || {});
|
|
19
|
+
const [loading, setLoading] = useState(false);
|
|
20
|
+
const [error, setError] = useState();
|
|
21
|
+
const [controller, setController] = useState();
|
|
22
|
+
const isUnmounted = useIsUnmounted();
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!controller || !opt.onAbort) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const onAbort = opt.onAbort;
|
|
28
|
+
controller.signal.addEventListener('abort', onAbort);
|
|
29
|
+
return () => {
|
|
30
|
+
controller.signal.removeEventListener('abort', onAbort);
|
|
31
|
+
};
|
|
32
|
+
}, [controller]);
|
|
33
|
+
const run = useRtCb((runParam) => {
|
|
34
|
+
const currParam = opt.catchParam ? Object.assign(Object.assign({}, param), (runParam || {})) : runParam;
|
|
35
|
+
setLoading(true);
|
|
36
|
+
setError(undefined);
|
|
37
|
+
if (controller) {
|
|
38
|
+
controller.abort();
|
|
39
|
+
}
|
|
40
|
+
const abortController = new AbortController();
|
|
41
|
+
setController(abortController);
|
|
42
|
+
return asyncFn(currParam, { signal: abortController.signal })
|
|
43
|
+
.then((resData) => {
|
|
44
|
+
if (isUnmounted() || abortController.signal.aborted)
|
|
45
|
+
return;
|
|
46
|
+
setData(opt.format ? opt.format(resData) : resData);
|
|
47
|
+
setParam(currParam);
|
|
48
|
+
setLoading(false);
|
|
49
|
+
}, (err) => {
|
|
50
|
+
if (isUnmounted() || abortController.signal.aborted)
|
|
51
|
+
return Promise.reject(err);
|
|
52
|
+
setError(err);
|
|
53
|
+
setLoading(false);
|
|
54
|
+
}).finally(() => {
|
|
55
|
+
if (isUnmounted())
|
|
56
|
+
return;
|
|
57
|
+
setController(undefined);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
const refresh = useRtCb(() => run(param));
|
|
61
|
+
useCreate(() => {
|
|
62
|
+
if (opt.immediate) {
|
|
63
|
+
run(param);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
useUnmount(() => {
|
|
67
|
+
if (controller) {
|
|
68
|
+
controller.abort();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return [data, { run, refresh, loading, error, param }];
|
|
72
|
+
};
|
|
73
|
+
export default useAsync;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 11:16:34
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-16 11:21:54
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useCallback } from 'react';
|
|
8
|
+
const useBoolState = (value) => {
|
|
9
|
+
const [val, setVal] = useState(value);
|
|
10
|
+
const switchFn = useCallback((switchValue) => {
|
|
11
|
+
if (switchValue === undefined || switchValue === null) {
|
|
12
|
+
setVal((oldVal) => !oldVal);
|
|
13
|
+
}
|
|
14
|
+
else if (typeof switchValue === 'boolean' || typeof switchValue === 'function') {
|
|
15
|
+
setVal(switchValue);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
setVal(!!switchValue);
|
|
19
|
+
}
|
|
20
|
+
}, []);
|
|
21
|
+
return [val, switchFn];
|
|
22
|
+
};
|
|
23
|
+
export default useBoolState;
|
package/es/useCreate.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 11:34:59
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 22:53:33
|
|
6
|
+
*/
|
|
7
|
+
import { useState } from 'react';
|
|
8
|
+
const useCreate = (cb) => {
|
|
9
|
+
useState(cb);
|
|
10
|
+
};
|
|
11
|
+
export default useCreate;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-19 22:55:14
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 22:55:14
|
|
6
|
+
*/
|
|
7
|
+
import { debounce } from 'lodash-es';
|
|
8
|
+
import { useMemo } from 'react';
|
|
9
|
+
import useRtCb from './useRtCb';
|
|
10
|
+
const useDebounce = (cb, wait, opts) => {
|
|
11
|
+
const rtCb = useRtCb(cb);
|
|
12
|
+
return useMemo(() => {
|
|
13
|
+
return debounce((...arg) => {
|
|
14
|
+
rtCb(...arg);
|
|
15
|
+
}, wait, opts);
|
|
16
|
+
}, []);
|
|
17
|
+
};
|
|
18
|
+
export default useDebounce;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-19 22:28:14
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 22:57:23
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback } from "react";
|
|
8
|
+
const useIgnoreAbortErrCb = (cb, deps = [], opts) => {
|
|
9
|
+
return useCallback((err) => {
|
|
10
|
+
var _a;
|
|
11
|
+
if (err.name === 'AbortError')
|
|
12
|
+
return (_a = opts === null || opts === void 0 ? void 0 : opts.onAbort) === null || _a === void 0 ? void 0 : _a.call(opts, err);
|
|
13
|
+
return cb(err);
|
|
14
|
+
}, deps);
|
|
15
|
+
};
|
|
16
|
+
export default useIgnoreAbortErrCb;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2023-12-14 16:51:29
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 23:11:26
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
8
|
+
const useInterval = () => {
|
|
9
|
+
const timerRef = useRef();
|
|
10
|
+
const clearTimer = useCallback(() => {
|
|
11
|
+
if (timerRef.current) {
|
|
12
|
+
window.clearInterval(timerRef.current);
|
|
13
|
+
timerRef.current = undefined;
|
|
14
|
+
}
|
|
15
|
+
}, []);
|
|
16
|
+
const bindTimer = useCallback((callback, timeout, ...arg) => {
|
|
17
|
+
clearTimer();
|
|
18
|
+
timerRef.current = window.setInterval(() => {
|
|
19
|
+
timerRef.current = undefined;
|
|
20
|
+
callback(...arg);
|
|
21
|
+
}, timeout);
|
|
22
|
+
}, []);
|
|
23
|
+
useEffect(() => clearTimer);
|
|
24
|
+
return [
|
|
25
|
+
bindTimer,
|
|
26
|
+
clearTimer,
|
|
27
|
+
];
|
|
28
|
+
};
|
|
29
|
+
export default useInterval;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 21:34:27
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-16 21:37:21
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
8
|
+
const useIsMounted = () => {
|
|
9
|
+
const ref = useRef(false);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
ref.current = true;
|
|
12
|
+
return () => {
|
|
13
|
+
ref.current = false;
|
|
14
|
+
};
|
|
15
|
+
}, []);
|
|
16
|
+
return useCallback(() => ref.current, []);
|
|
17
|
+
};
|
|
18
|
+
export default useIsMounted;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 21:33:24
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-16 21:35:46
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
8
|
+
const useIsUnmounted = () => {
|
|
9
|
+
const ref = useRef(false);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
return () => {
|
|
12
|
+
ref.current = true;
|
|
13
|
+
};
|
|
14
|
+
}, []);
|
|
15
|
+
return useCallback(() => ref.current, []);
|
|
16
|
+
};
|
|
17
|
+
export default useIsUnmounted;
|
package/es/useMount.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-18 00:21:16
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-18 00:21:16
|
|
6
|
+
*/
|
|
7
|
+
import { useEffect } from 'react';
|
|
8
|
+
const useMount = (cb) => {
|
|
9
|
+
useEffect(cb, []);
|
|
10
|
+
};
|
|
11
|
+
export default useMount;
|
package/es/useOption.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 11:35:37
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-16 21:31:54
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback, useState } from 'react';
|
|
8
|
+
const useOption = (defOpt = {}) => {
|
|
9
|
+
const [initOpt] = useState(defOpt);
|
|
10
|
+
const [option, setOption] = useState(initOpt);
|
|
11
|
+
const reset = useCallback(() => {
|
|
12
|
+
setOption(initOpt);
|
|
13
|
+
}, [initOpt]);
|
|
14
|
+
const update = useCallback((newOpts) => {
|
|
15
|
+
setOption((oldOpts) => (Object.assign(Object.assign({}, (oldOpts || {})), (typeof newOpts === 'function' ? newOpts(oldOpts) : newOpts || {}))));
|
|
16
|
+
}, []);
|
|
17
|
+
return [option, { setOption, reset, update }];
|
|
18
|
+
};
|
|
19
|
+
export default useOption;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2023-11-24 10:52:51
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 23:17:45
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback, useEffect } from 'react';
|
|
8
|
+
let resizeObserver = null;
|
|
9
|
+
let observeCatch = null;
|
|
10
|
+
function init() {
|
|
11
|
+
if (resizeObserver) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
observeCatch = new Map();
|
|
15
|
+
resizeObserver = new window.ResizeObserver((targets) => {
|
|
16
|
+
targets === null || targets === void 0 ? void 0 : targets.forEach((item) => {
|
|
17
|
+
var _a;
|
|
18
|
+
(_a = observeCatch === null || observeCatch === void 0 ? void 0 : observeCatch.get(item === null || item === void 0 ? void 0 : item.target)) === null || _a === void 0 ? void 0 : _a(item);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
;
|
|
23
|
+
const observe = (target, cb) => {
|
|
24
|
+
if (!resizeObserver) {
|
|
25
|
+
init();
|
|
26
|
+
}
|
|
27
|
+
observeCatch === null || observeCatch === void 0 ? void 0 : observeCatch.set(target, cb);
|
|
28
|
+
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.observe(target);
|
|
29
|
+
};
|
|
30
|
+
const unobserve = (target) => {
|
|
31
|
+
if (!resizeObserver) {
|
|
32
|
+
init();
|
|
33
|
+
}
|
|
34
|
+
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.unobserve(target);
|
|
35
|
+
observeCatch === null || observeCatch === void 0 ? void 0 : observeCatch.delete(target);
|
|
36
|
+
};
|
|
37
|
+
export default function useResizeObserver(dom, cb) {
|
|
38
|
+
const selfObserve = useCallback(() => {
|
|
39
|
+
observe(dom, cb);
|
|
40
|
+
}, [dom, cb]);
|
|
41
|
+
const selfUnobserve = useCallback(() => {
|
|
42
|
+
unobserve(dom);
|
|
43
|
+
}, [dom]);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
observe(dom, cb);
|
|
46
|
+
return () => unobserve(dom);
|
|
47
|
+
}, [dom, cb]);
|
|
48
|
+
return [selfObserve, selfUnobserve];
|
|
49
|
+
}
|
|
50
|
+
;
|
package/es/useRtCb.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-17 00:22:11
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-17 00:22:56
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback } from 'react';
|
|
8
|
+
import useRtRef from './useRtRef';
|
|
9
|
+
const useRtCb = (cb, deps = []) => {
|
|
10
|
+
const ref = useRtRef(cb);
|
|
11
|
+
return useCallback((...args) => {
|
|
12
|
+
return ref.current(...args);
|
|
13
|
+
}, deps);
|
|
14
|
+
};
|
|
15
|
+
export default useRtCb;
|
package/es/useRtRef.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 22:19:57
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-17 00:10:45
|
|
6
|
+
*/
|
|
7
|
+
import { useRef } from 'react';
|
|
8
|
+
const useRtRef = (val) => {
|
|
9
|
+
const ref = useRef(val);
|
|
10
|
+
ref.current = val;
|
|
11
|
+
return ref;
|
|
12
|
+
};
|
|
13
|
+
export default useRtRef;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 11:36:09
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 22:41:39
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback } from 'react';
|
|
8
|
+
import useIsUnmount from "./useIsUnmounted";
|
|
9
|
+
const useSafeRunner = () => {
|
|
10
|
+
const isUnmount = useIsUnmount();
|
|
11
|
+
return useCallback((cb, unmountCb) => {
|
|
12
|
+
if (isUnmount()) {
|
|
13
|
+
unmountCb === null || unmountCb === void 0 ? void 0 : unmountCb();
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
cb();
|
|
17
|
+
}
|
|
18
|
+
}, []);
|
|
19
|
+
};
|
|
20
|
+
export default useSafeRunner;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-19 22:55:28
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 22:55:48
|
|
6
|
+
*/
|
|
7
|
+
import { throttle } from 'lodash-es';
|
|
8
|
+
import { useMemo } from 'react';
|
|
9
|
+
import useRtCb from './useRtCb';
|
|
10
|
+
const useThrottle = (cb, wait, opts) => {
|
|
11
|
+
const rtCb = useRtCb(cb);
|
|
12
|
+
return useMemo(() => {
|
|
13
|
+
return throttle((...arg) => {
|
|
14
|
+
rtCb(...arg);
|
|
15
|
+
}, wait, opts);
|
|
16
|
+
}, []);
|
|
17
|
+
};
|
|
18
|
+
export default useThrottle;
|
package/es/useTimeout.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-19 23:10:13
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-19 23:10:13
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
8
|
+
const useTimeout = () => {
|
|
9
|
+
const timerRef = useRef();
|
|
10
|
+
const clearTimer = useCallback(() => {
|
|
11
|
+
if (timerRef.current) {
|
|
12
|
+
window.clearTimeout(timerRef.current);
|
|
13
|
+
timerRef.current = undefined;
|
|
14
|
+
}
|
|
15
|
+
}, []);
|
|
16
|
+
const bindTimer = useCallback((callback, timeout, ...arg) => {
|
|
17
|
+
clearTimer();
|
|
18
|
+
timerRef.current = window.setTimeout(() => {
|
|
19
|
+
timerRef.current = undefined;
|
|
20
|
+
callback(...arg);
|
|
21
|
+
}, timeout);
|
|
22
|
+
}, []);
|
|
23
|
+
useEffect(() => clearTimer);
|
|
24
|
+
return [
|
|
25
|
+
bindTimer,
|
|
26
|
+
clearTimer,
|
|
27
|
+
];
|
|
28
|
+
};
|
|
29
|
+
export default useTimeout;
|
package/es/useUnmount.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 11:35:20
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-18 00:17:09
|
|
6
|
+
*/
|
|
7
|
+
import { useEffect } from 'react';
|
|
8
|
+
import useRtRef from './useRtRef';
|
|
9
|
+
const useUnmount = (cb) => {
|
|
10
|
+
const ref = useRtRef(cb);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
return () => {
|
|
13
|
+
ref.current();
|
|
14
|
+
};
|
|
15
|
+
}, []);
|
|
16
|
+
};
|
|
17
|
+
export default useUnmount;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author: apathyjade
|
|
3
|
+
* @Date: 2025-03-16 11:35:13
|
|
4
|
+
* @Last Modified by: apathyjade
|
|
5
|
+
* @Last Modified time: 2025-03-16 11:35:13
|
|
6
|
+
*/
|
|
7
|
+
import { useRef, useEffect } from 'react';
|
|
8
|
+
const useUpdateEffect = (cb, deps) => {
|
|
9
|
+
const ref = useRef(false);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (ref.current) {
|
|
12
|
+
return cb();
|
|
13
|
+
}
|
|
14
|
+
ref.current = true;
|
|
15
|
+
}, deps);
|
|
16
|
+
};
|
|
17
|
+
export default useUpdateEffect;
|
package/es/useValue.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: jade <apathyjade@outlook.com>
|
|
3
|
+
* @Version: 0.0.1
|
|
4
|
+
* @Date: 2023-04-05 14:39:52
|
|
5
|
+
* @Last Modified by: jade
|
|
6
|
+
* @Last Modified Time: 2023-04-05 14:39:52
|
|
7
|
+
*/
|
|
8
|
+
import { useState, useEffect } from 'react';
|
|
9
|
+
import useRtCb from './useRtCb';
|
|
10
|
+
const defEqual = (a, b) => a === b;
|
|
11
|
+
const useValue = (value, onChange, opts) => {
|
|
12
|
+
const { isEqual = defEqual } = opts || {};
|
|
13
|
+
const [val, setVal] = useState(value);
|
|
14
|
+
const updateValue = useRtCb((value) => {
|
|
15
|
+
setVal(value);
|
|
16
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(value);
|
|
17
|
+
}, []);
|
|
18
|
+
const [oldValue, setOldValue] = useState(value);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (!isEqual(value, oldValue)) {
|
|
21
|
+
setOldValue(value);
|
|
22
|
+
if (!isEqual(value, val)) {
|
|
23
|
+
updateValue(value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}, [value, oldValue, val]);
|
|
27
|
+
return [val, setVal];
|
|
28
|
+
};
|
|
29
|
+
export default useValue;
|