@csshero/usehooks 0.1.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.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/index.d.ts +17 -0
  4. package/dist/index.js +17 -0
  5. package/dist/useBoolean/demo/demo1.d.ts +3 -0
  6. package/dist/useBoolean/demo/demo1.js +23 -0
  7. package/dist/useBoolean/index.d.ts +8 -0
  8. package/dist/useBoolean/index.js +25 -0
  9. package/dist/useCreation/demo/demo1.d.ts +6 -0
  10. package/dist/useCreation/demo/demo1.js +24 -0
  11. package/dist/useCreation/index.d.ts +3 -0
  12. package/dist/useCreation/index.js +17 -0
  13. package/dist/useDebounceFn/demo/demo1.d.ts +7 -0
  14. package/dist/useDebounceFn/demo/demo1.js +39 -0
  15. package/dist/useDebounceFn/demo/demo2.d.ts +7 -0
  16. package/dist/useDebounceFn/demo/demo2.js +29 -0
  17. package/dist/useDebounceFn/demo/demo3.d.ts +7 -0
  18. package/dist/useDebounceFn/demo/demo3.js +30 -0
  19. package/dist/useDebounceFn/index.d.ts +14 -0
  20. package/dist/useDebounceFn/index.js +28 -0
  21. package/dist/useDebounceValue/demo/demo1.d.ts +7 -0
  22. package/dist/useDebounceValue/demo/demo1.js +31 -0
  23. package/dist/useDebounceValue/index.d.ts +8 -0
  24. package/dist/useDebounceValue/index.js +18 -0
  25. package/dist/useEventEmitter/index.d.ts +2 -0
  26. package/dist/useEventEmitter/index.js +2 -0
  27. package/dist/useInterval/demo/demo1.d.ts +7 -0
  28. package/dist/useInterval/demo/demo1.js +18 -0
  29. package/dist/useInterval/demo/demo2.d.ts +7 -0
  30. package/dist/useInterval/demo/demo2.js +45 -0
  31. package/dist/useInterval/index.d.ts +3 -0
  32. package/dist/useInterval/index.js +29 -0
  33. package/dist/useLatest/demo/demo1.d.ts +7 -0
  34. package/dist/useLatest/demo/demo1.js +38 -0
  35. package/dist/useLatest/index.d.ts +3 -0
  36. package/dist/useLatest/index.js +7 -0
  37. package/dist/useMap/demo/demo1.d.ts +7 -0
  38. package/dist/useMap/demo/demo1.js +51 -0
  39. package/dist/useMap/index.d.ts +9 -0
  40. package/dist/useMap/index.js +46 -0
  41. package/dist/useMemoizedFn/demo/demo1.d.ts +7 -0
  42. package/dist/useMemoizedFn/demo/demo1.js +45 -0
  43. package/dist/useMemoizedFn/demo/demo2.d.ts +3 -0
  44. package/dist/useMemoizedFn/demo/demo2.js +48 -0
  45. package/dist/useMemoizedFn/index.d.ts +3 -0
  46. package/dist/useMemoizedFn/index.js +21 -0
  47. package/dist/useMount/demo/demo1.d.ts +7 -0
  48. package/dist/useMount/demo/demo1.js +24 -0
  49. package/dist/useMount/index.d.ts +2 -0
  50. package/dist/useMount/index.js +7 -0
  51. package/dist/useSet/demo/demo1.d.ts +3 -0
  52. package/dist/useSet/demo/demo1.js +36 -0
  53. package/dist/useSet/index.d.ts +6 -0
  54. package/dist/useSet/index.js +41 -0
  55. package/dist/useThrottleFn/demo/demo1.d.ts +7 -0
  56. package/dist/useThrottleFn/demo/demo1.js +39 -0
  57. package/dist/useThrottleFn/demo/demo2.d.ts +7 -0
  58. package/dist/useThrottleFn/demo/demo2.js +29 -0
  59. package/dist/useThrottleFn/index.d.ts +13 -0
  60. package/dist/useThrottleFn/index.js +28 -0
  61. package/dist/useThrottleValue/demo/demo1.d.ts +7 -0
  62. package/dist/useThrottleValue/demo/demo1.js +31 -0
  63. package/dist/useThrottleValue/index.d.ts +7 -0
  64. package/dist/useThrottleValue/index.js +18 -0
  65. package/dist/useTimeout/demo/demo1.d.ts +7 -0
  66. package/dist/useTimeout/demo/demo1.js +19 -0
  67. package/dist/useTimeout/demo/demo2.d.ts +7 -0
  68. package/dist/useTimeout/demo/demo2.js +43 -0
  69. package/dist/useTimeout/index.d.ts +3 -0
  70. package/dist/useTimeout/index.js +22 -0
  71. package/dist/useToggle/demo/demo1.d.ts +7 -0
  72. package/dist/useToggle/demo/demo1.js +32 -0
  73. package/dist/useToggle/demo/demo2.d.ts +7 -0
  74. package/dist/useToggle/demo/demo2.js +45 -0
  75. package/dist/useToggle/demo/demo3.d.ts +7 -0
  76. package/dist/useToggle/demo/demo3.js +32 -0
  77. package/dist/useToggle/index.d.ts +10 -0
  78. package/dist/useToggle/index.js +35 -0
  79. package/dist/useUnmount/demo/demo1.d.ts +7 -0
  80. package/dist/useUnmount/demo/demo1.js +24 -0
  81. package/dist/useUnmount/index.d.ts +2 -0
  82. package/dist/useUnmount/index.js +13 -0
  83. package/dist/useUpdate/demo/demo1.d.ts +7 -0
  84. package/dist/useUpdate/demo/demo1.js +17 -0
  85. package/dist/useUpdate/index.d.ts +2 -0
  86. package/dist/useUpdate/index.js +13 -0
  87. package/dist/utils/isSameDep.d.ts +3 -0
  88. package/dist/utils/isSameDep.js +7 -0
  89. package/package.json +81 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * title: 案例
3
+ * description: 传递需要初始化的值然后进行操作
4
+ */
5
+ import React from 'react';
6
+ declare const _default: () => React.JSX.Element;
7
+ export default _default;
@@ -0,0 +1,51 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ /**
3
+ * title: 案例
4
+ * description: 传递需要初始化的值然后进行操作
5
+ */
6
+
7
+ import { useMap } from "../..";
8
+ import React from 'react';
9
+ export default (function () {
10
+ var _useMap = useMap([['msg', 'hello world'], ['info', 'hello react']]),
11
+ _useMap2 = _slicedToArray(_useMap, 2),
12
+ map = _useMap2[0],
13
+ _useMap2$ = _useMap2[1],
14
+ set = _useMap2$.set,
15
+ setAll = _useMap2$.setAll,
16
+ remove = _useMap2$.remove,
17
+ reset = _useMap2$.reset,
18
+ get = _useMap2$.get;
19
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", {
20
+ type: "button",
21
+ onClick: function onClick() {
22
+ return set(String(Date.now()), new Date().toJSON());
23
+ }
24
+ }, "Add"), /*#__PURE__*/React.createElement("button", {
25
+ type: "button",
26
+ onClick: function onClick() {
27
+ return setAll([['text', 'this is a new Map']]);
28
+ },
29
+ style: {
30
+ margin: '0 8px'
31
+ }
32
+ }, "Set new Map"), /*#__PURE__*/React.createElement("button", {
33
+ type: "button",
34
+ onClick: function onClick() {
35
+ return remove('msg');
36
+ },
37
+ disabled: !get('msg')
38
+ }, "Remove msg"), /*#__PURE__*/React.createElement("button", {
39
+ type: "button",
40
+ onClick: function onClick() {
41
+ return reset();
42
+ },
43
+ style: {
44
+ margin: '0 8px'
45
+ }
46
+ }, "Reset"), /*#__PURE__*/React.createElement("div", {
47
+ style: {
48
+ marginTop: 16
49
+ }
50
+ }, /*#__PURE__*/React.createElement("pre", null, JSON.stringify(Array.from(map), null, 2))));
51
+ });
@@ -0,0 +1,9 @@
1
+ interface Actions<K, V> {
2
+ set: (key: K, value: V) => void;
3
+ get: (key: K) => V | undefined;
4
+ remove: (key: K) => void;
5
+ reset: () => void;
6
+ setAll: (newMap: Iterable<readonly [K, V]>) => void;
7
+ }
8
+ declare const useMap: <K, V>(initValue?: Iterable<readonly [K, V]> | undefined) => [Map<K, V>, Actions<K, V>];
9
+ export default useMap;
@@ -0,0 +1,46 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useState } from 'react';
3
+ import useCreation from "../useCreation";
4
+ var useMap = function useMap(initValue) {
5
+ var initMap = function initMap() {
6
+ return new Map(initValue);
7
+ };
8
+ var _useState = useState(initMap),
9
+ _useState2 = _slicedToArray(_useState, 2),
10
+ map = _useState2[0],
11
+ setMap = _useState2[1];
12
+ var actions = useCreation(function () {
13
+ var set = function set(key, value) {
14
+ setMap(function (prev) {
15
+ var temp = new Map(prev);
16
+ temp.set(key, value);
17
+ return temp;
18
+ });
19
+ };
20
+ var get = function get(key) {
21
+ return map.get(key);
22
+ };
23
+ var remove = function remove(key) {
24
+ setMap(function (prev) {
25
+ var temp = new Map(prev);
26
+ temp.delete(key);
27
+ return temp;
28
+ });
29
+ };
30
+ var reset = function reset() {
31
+ return setMap(initMap());
32
+ };
33
+ var setAll = function setAll(newMap) {
34
+ setMap(new Map(newMap));
35
+ };
36
+ return {
37
+ set: set,
38
+ get: get,
39
+ remove: remove,
40
+ reset: reset,
41
+ setAll: setAll
42
+ };
43
+ }, []);
44
+ return [map, actions];
45
+ };
46
+ export default useMap;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * title: 案例
3
+ * description: useMemoizedFn 与 useCallback 可以实现同样的效果。
4
+ */
5
+ import React from 'react';
6
+ declare const _default: () => React.JSX.Element;
7
+ export default _default;
@@ -0,0 +1,45 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ /**
3
+ * title: 案例
4
+ * description: useMemoizedFn 与 useCallback 可以实现同样的效果。
5
+ */
6
+
7
+ import { useMemoizedFn } from "../..";
8
+ import React, { useCallback, useState } from 'react';
9
+ export default (function () {
10
+ var _useState = useState(0),
11
+ _useState2 = _slicedToArray(_useState, 2),
12
+ count = _useState2[0],
13
+ setCount = _useState2[1];
14
+ var _useState3 = useState('Current count is 0'),
15
+ _useState4 = _slicedToArray(_useState3, 2),
16
+ info = _useState4[0],
17
+ setInfo = _useState4[1];
18
+ var callbackFn = useCallback(function () {
19
+ setInfo("Current count is ".concat(count));
20
+ }, [count]);
21
+ var memoizedFn = useMemoizedFn(function () {
22
+ setInfo("Current count is ".concat(count));
23
+ });
24
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("p", null, "count: ", count), /*#__PURE__*/React.createElement("p", null, "info: ", info), /*#__PURE__*/React.createElement("button", {
25
+ type: "button",
26
+ onClick: function onClick() {
27
+ setCount(function (c) {
28
+ return c + 1;
29
+ });
30
+ }
31
+ }, "Add Count"), /*#__PURE__*/React.createElement("div", {
32
+ style: {
33
+ marginTop: 16
34
+ }
35
+ }, /*#__PURE__*/React.createElement("button", {
36
+ type: "button",
37
+ onClick: callbackFn
38
+ }, "call callbackFn"), /*#__PURE__*/React.createElement("button", {
39
+ type: "button",
40
+ onClick: memoizedFn,
41
+ style: {
42
+ marginLeft: 8
43
+ }
44
+ }, "call memoizedFn")));
45
+ });
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const _default: () => React.JSX.Element;
3
+ export default _default;
@@ -0,0 +1,48 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useMemoizedFn } from "../..";
3
+ import React, { useCallback, useRef, useState } from 'react';
4
+ var ExpensiveTree = /*#__PURE__*/React.memo(function (_ref) {
5
+ var showCount = _ref.showCount;
6
+ var renderCountRef = useRef(0);
7
+ renderCountRef.current += 1;
8
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("p", null, "\u7EC4\u4EF6\u88AB\u6E32\u67D3\u7684\u6B21\u6570: ", renderCountRef.current), /*#__PURE__*/React.createElement("button", {
9
+ type: "button",
10
+ onClick: showCount
11
+ }, "showParentCount"));
12
+ });
13
+ export default (function () {
14
+ var _useState = useState(0),
15
+ _useState2 = _slicedToArray(_useState, 2),
16
+ count = _useState2[0],
17
+ setCount = _useState2[1];
18
+ var _useState3 = useState('Current count is 0'),
19
+ _useState4 = _slicedToArray(_useState3, 2),
20
+ info = _useState4[0],
21
+ setInfo = _useState4[1];
22
+ var callbackFn = useCallback(function () {
23
+ setInfo("Current count is ".concat(count));
24
+ }, [count]);
25
+ var memoizedFn = useMemoizedFn(function () {
26
+ setInfo("Current count is ".concat(count));
27
+ });
28
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("p", null, "count: ", count), /*#__PURE__*/React.createElement("p", null, "info: ", info), /*#__PURE__*/React.createElement("button", {
29
+ type: "button",
30
+ onClick: function onClick() {
31
+ setCount(function (c) {
32
+ return c + 1;
33
+ });
34
+ }
35
+ }, "Add Count"), /*#__PURE__*/React.createElement("div", {
36
+ style: {
37
+ marginTop: 32
38
+ }
39
+ }, /*#__PURE__*/React.createElement("h3", null, "\u4F20\u9012useCallback function\u7684\u7EC4\u4EF6:"), /*#__PURE__*/React.createElement(ExpensiveTree, {
40
+ showCount: callbackFn
41
+ })), /*#__PURE__*/React.createElement("div", {
42
+ style: {
43
+ marginTop: 32
44
+ }
45
+ }, /*#__PURE__*/React.createElement("h3", null, "\u4F20\u9012useMemoizedFn function\u7684\u7EC4\u4EF6:"), /*#__PURE__*/React.createElement(ExpensiveTree, {
46
+ showCount: memoizedFn
47
+ })));
48
+ });
@@ -0,0 +1,3 @@
1
+ type FnType = (...args: any[]) => any;
2
+ declare const useMemoizedFn: <T extends FnType>(fn: T) => T;
3
+ export default useMemoizedFn;
@@ -0,0 +1,21 @@
1
+ import { useMemo, useRef } from 'react';
2
+ var useMemoizedFn = function useMemoizedFn(fn) {
3
+ var fnRef = useRef(fn);
4
+
5
+ // why not write `fnRef.current = fn`?
6
+ // https://github.com/alibaba/hooks/issues/728
7
+ fnRef.current = useMemo(function () {
8
+ return fn;
9
+ }, [fn]);
10
+ var memoizedFn = useRef();
11
+ if (!memoizedFn.current) {
12
+ memoizedFn.current = function () {
13
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
14
+ args[_key] = arguments[_key];
15
+ }
16
+ return fnRef.current.apply(this, args);
17
+ };
18
+ }
19
+ return memoizedFn.current;
20
+ };
21
+ export default useMemoizedFn;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * title: 案例
3
+ * description: 在组件首次渲染时,执行方法。
4
+ */
5
+ import React from 'react';
6
+ declare const _default: () => React.JSX.Element;
7
+ export default _default;
@@ -0,0 +1,24 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ /**
3
+ * title: 案例
4
+ * description: 在组件首次渲染时,执行方法。
5
+ */
6
+
7
+ import { useBoolean, useMount } from "../..";
8
+ import React from 'react';
9
+ var MyComponent = function MyComponent() {
10
+ useMount(function () {
11
+ alert('组件首次渲染,执行传入函数。');
12
+ });
13
+ return /*#__PURE__*/React.createElement("div", null, "Hello World");
14
+ };
15
+ export default (function () {
16
+ var _useBoolean = useBoolean(false),
17
+ _useBoolean2 = _slicedToArray(_useBoolean, 2),
18
+ state = _useBoolean2[0],
19
+ toggle = _useBoolean2[1].toggle;
20
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
21
+ type: "button",
22
+ onClick: toggle
23
+ }, state ? '卸载组件' : '挂载组件'), state && /*#__PURE__*/React.createElement(MyComponent, null));
24
+ });
@@ -0,0 +1,2 @@
1
+ declare const useMount: (callback: () => void) => void;
2
+ export default useMount;
@@ -0,0 +1,7 @@
1
+ import { useEffect } from 'react';
2
+ var useMount = function useMount(callback) {
3
+ useEffect(function () {
4
+ callback();
5
+ }, []);
6
+ };
7
+ export default useMount;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const _default: () => React.JSX.Element;
3
+ export default _default;
@@ -0,0 +1,36 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useSet } from "../..";
3
+ import React from 'react';
4
+ export default (function () {
5
+ var _useSet = useSet(['Hello']),
6
+ _useSet2 = _slicedToArray(_useSet, 2),
7
+ set = _useSet2[0],
8
+ _useSet2$ = _useSet2[1],
9
+ add = _useSet2$.add,
10
+ remove = _useSet2$.remove,
11
+ reset = _useSet2$.reset;
12
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", {
13
+ type: "button",
14
+ onClick: function onClick() {
15
+ return add(String(Date.now()));
16
+ }
17
+ }, "Add Timestamp"), /*#__PURE__*/React.createElement("button", {
18
+ type: "button",
19
+ onClick: function onClick() {
20
+ return remove('Hello');
21
+ },
22
+ disabled: !set.has('Hello'),
23
+ style: {
24
+ margin: '0 8px'
25
+ }
26
+ }, "Remove Hello"), /*#__PURE__*/React.createElement("button", {
27
+ type: "button",
28
+ onClick: function onClick() {
29
+ return reset();
30
+ }
31
+ }, "Reset"), /*#__PURE__*/React.createElement("div", {
32
+ style: {
33
+ marginTop: 16
34
+ }
35
+ }, /*#__PURE__*/React.createElement("pre", null, JSON.stringify(Array.from(set), null, 2))));
36
+ });
@@ -0,0 +1,6 @@
1
+ declare function useSet<K>(initialValue?: Iterable<K>): readonly [Set<K>, {
2
+ readonly add: (key: K) => void;
3
+ readonly remove: (key: K) => void;
4
+ readonly reset: () => void;
5
+ }];
6
+ export default useSet;
@@ -0,0 +1,41 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useState } from 'react';
3
+ import useMemoizedFn from "../useMemoizedFn";
4
+ function useSet(initialValue) {
5
+ var getInitValue = function getInitValue() {
6
+ return new Set(initialValue);
7
+ };
8
+ var _useState = useState(getInitValue),
9
+ _useState2 = _slicedToArray(_useState, 2),
10
+ set = _useState2[0],
11
+ setSet = _useState2[1];
12
+ var add = function add(key) {
13
+ if (set.has(key)) {
14
+ return;
15
+ }
16
+ setSet(function (prevSet) {
17
+ var temp = new Set(prevSet);
18
+ temp.add(key);
19
+ return temp;
20
+ });
21
+ };
22
+ var remove = function remove(key) {
23
+ if (!set.has(key)) {
24
+ return;
25
+ }
26
+ setSet(function (prevSet) {
27
+ var temp = new Set(prevSet);
28
+ temp.delete(key);
29
+ return temp;
30
+ });
31
+ };
32
+ var reset = function reset() {
33
+ return setSet(getInitValue());
34
+ };
35
+ return [set, {
36
+ add: useMemoizedFn(add),
37
+ remove: useMemoizedFn(remove),
38
+ reset: useMemoizedFn(reset)
39
+ }];
40
+ }
41
+ export default useSet;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * title: 案例
3
+ * description: 频繁调用 run,但只会每隔 1000ms 执行一次相关函数。
4
+ */
5
+ import React from 'react';
6
+ declare const _default: () => React.JSX.Element;
7
+ export default _default;
@@ -0,0 +1,39 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ /**
3
+ * title: 案例
4
+ * description: 频繁调用 run,但只会每隔 1000ms 执行一次相关函数。
5
+ */
6
+
7
+ import { useThrottleFn } from "../..";
8
+ import React, { useState } from 'react';
9
+ export default (function () {
10
+ var _useState = useState(0),
11
+ _useState2 = _slicedToArray(_useState, 2),
12
+ value = _useState2[0],
13
+ setValue = _useState2[1];
14
+ var _useThrottleFn = useThrottleFn(function () {
15
+ setValue(value + 1);
16
+ }, {
17
+ wait: 1000
18
+ }),
19
+ run = _useThrottleFn.run,
20
+ cancel = _useThrottleFn.cancel,
21
+ flush = _useThrottleFn.flush;
22
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("p", {
23
+ style: {
24
+ marginTop: 16
25
+ }
26
+ }, " count: ", value, " "), /*#__PURE__*/React.createElement("button", {
27
+ type: "button",
28
+ onClick: run
29
+ }, "\u70B9\u51FB\u8C03\u7528"), /*#__PURE__*/React.createElement("button", {
30
+ type: "button",
31
+ onClick: flush,
32
+ style: {
33
+ margin: '0 8px'
34
+ }
35
+ }, "\u7ACB\u5373\u5B8C\u6210\u8282\u6D41\u51FD\u6570"), /*#__PURE__*/React.createElement("button", {
36
+ type: "button",
37
+ onClick: cancel
38
+ }, "\u53D6\u6D88"));
39
+ });
@@ -0,0 +1,7 @@
1
+ /**
2
+ * title: 案例
3
+ * description: 设置 leading 为 false 当频繁调用 run,每隔 1000ms 执行一次相关函数 但第一次不会调用。
4
+ */
5
+ import React from 'react';
6
+ declare const _default: () => React.JSX.Element;
7
+ export default _default;
@@ -0,0 +1,29 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ /**
3
+ * title: 案例
4
+ * description: 设置 leading 为 false 当频繁调用 run,每隔 1000ms 执行一次相关函数 但第一次不会调用。
5
+ */
6
+
7
+ import { useThrottleFn } from "../..";
8
+ import React, { useState } from 'react';
9
+ export default (function () {
10
+ var _useState = useState(0),
11
+ _useState2 = _slicedToArray(_useState, 2),
12
+ value = _useState2[0],
13
+ setValue = _useState2[1];
14
+ var _useThrottleFn = useThrottleFn(function () {
15
+ setValue(value + 1);
16
+ }, {
17
+ leading: false,
18
+ wait: 1000
19
+ }),
20
+ run = _useThrottleFn.run;
21
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("p", {
22
+ style: {
23
+ marginTop: 16
24
+ }
25
+ }, " count: ", value, " "), /*#__PURE__*/React.createElement("button", {
26
+ type: "button",
27
+ onClick: run
28
+ }, "\u70B9\u51FB\u8C03\u7528"));
29
+ });
@@ -0,0 +1,13 @@
1
+ interface ThrottleOptions {
2
+ wait?: number;
3
+ leading?: boolean;
4
+ trailing?: boolean;
5
+ }
6
+ interface ThrottledFn<T extends FnType> {
7
+ run: (...args: Parameters<T>) => ReturnType<T>;
8
+ cancel: () => void;
9
+ flush: () => void;
10
+ }
11
+ type FnType = (...args: any[]) => any;
12
+ declare const useThrottleFn: <T extends FnType>(callback: T, option: ThrottleOptions) => ThrottledFn<T>;
13
+ export default useThrottleFn;
@@ -0,0 +1,28 @@
1
+ import _ from 'lodash-es';
2
+ import useCreation from "../useCreation";
3
+ import useLatest from "../useLatest";
4
+ import useUnmount from "../useUnmount";
5
+ var useThrottleFn = function useThrottleFn(callback, option) {
6
+ var _option$leading, _option$trailing, _option$wait;
7
+ // 设置默认值
8
+ option.leading = (_option$leading = option === null || option === void 0 ? void 0 : option.leading) !== null && _option$leading !== void 0 ? _option$leading : true;
9
+ option.trailing = (_option$trailing = option === null || option === void 0 ? void 0 : option.trailing) !== null && _option$trailing !== void 0 ? _option$trailing : true;
10
+ option.wait = (_option$wait = option === null || option === void 0 ? void 0 : option.wait) !== null && _option$wait !== void 0 ? _option$wait : 1000;
11
+ var callbackRef = useLatest(callback);
12
+
13
+ // 保存_.debounce()返回的函数
14
+ var throttle = useCreation(function () {
15
+ return _.throttle(function () {
16
+ return callbackRef.current.apply(callbackRef, arguments);
17
+ }, option.wait, option);
18
+ }, []);
19
+ useUnmount(function () {
20
+ throttle.cancel();
21
+ });
22
+ return {
23
+ run: throttle,
24
+ cancel: throttle.cancel,
25
+ flush: throttle.flush
26
+ };
27
+ };
28
+ export default useThrottleFn;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * title: 案例
3
+ * description: ThrottledValue 每隔 1000ms 变化一次。
4
+ */
5
+ import React from 'react';
6
+ declare const _default: () => React.JSX.Element;
7
+ export default _default;
@@ -0,0 +1,31 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ /**
3
+ * title: 案例
4
+ * description: ThrottledValue 每隔 1000ms 变化一次。
5
+ */
6
+
7
+ import { useThrottleValue } from "../..";
8
+ import React, { useState } from 'react';
9
+ export default (function () {
10
+ var _useState = useState(''),
11
+ _useState2 = _slicedToArray(_useState, 2),
12
+ value = _useState2[0],
13
+ setValue = _useState2[1];
14
+ var throttledValue = useThrottleValue(value, {
15
+ wait: 1000
16
+ });
17
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("input", {
18
+ value: value,
19
+ onChange: function onChange(e) {
20
+ return setValue(e.target.value);
21
+ },
22
+ placeholder: "\u4FEE\u6539throttledValue",
23
+ style: {
24
+ width: 280
25
+ }
26
+ }), /*#__PURE__*/React.createElement("p", {
27
+ style: {
28
+ marginTop: 16
29
+ }
30
+ }, "throttledValue: ", throttledValue));
31
+ });
@@ -0,0 +1,7 @@
1
+ interface ThrottleOptions {
2
+ wait?: number;
3
+ leading?: boolean;
4
+ trailing?: boolean;
5
+ }
6
+ declare const useThrottleValue: <T>(value: T, options: ThrottleOptions) => T;
7
+ export default useThrottleValue;
@@ -0,0 +1,18 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useEffect, useState } from 'react';
3
+ import useThrottleFn from "../useThrottleFn";
4
+ var useThrottleValue = function useThrottleValue(value, options) {
5
+ var _useState = useState(value),
6
+ _useState2 = _slicedToArray(_useState, 2),
7
+ throttled = _useState2[0],
8
+ setThrottled = _useState2[1];
9
+ var _useThrottleFn = useThrottleFn(function () {
10
+ setThrottled(value);
11
+ }, options),
12
+ run = _useThrottleFn.run;
13
+ useEffect(function () {
14
+ run();
15
+ }, [value]);
16
+ return throttled;
17
+ };
18
+ export default useThrottleValue;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * title: 案例
3
+ * description: 3000ms 后执行一次
4
+ */
5
+ import { FC } from 'react';
6
+ declare const DemoOne: FC;
7
+ export default DemoOne;
@@ -0,0 +1,19 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ /**
3
+ * title: 案例
4
+ * description: 3000ms 后执行一次
5
+ */
6
+
7
+ import { useTimeout } from "../..";
8
+ import React, { useState } from 'react';
9
+ var DemoOne = function DemoOne() {
10
+ var _useState = useState(0),
11
+ _useState2 = _slicedToArray(_useState, 2),
12
+ count = _useState2[0],
13
+ setCount = _useState2[1];
14
+ useTimeout(function () {
15
+ setCount(count + 1);
16
+ }, 3000);
17
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", null, "count: ", count));
18
+ };
19
+ export default DemoOne;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * title: 案例
3
+ * description: 动态修改 delay 以实现定时器间隔变化与暂停。
4
+ */
5
+ import { FC } from 'react';
6
+ declare const DemoTwo: FC;
7
+ export default DemoTwo;