@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.
- package/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +17 -0
- package/dist/useBoolean/demo/demo1.d.ts +3 -0
- package/dist/useBoolean/demo/demo1.js +23 -0
- package/dist/useBoolean/index.d.ts +8 -0
- package/dist/useBoolean/index.js +25 -0
- package/dist/useCreation/demo/demo1.d.ts +6 -0
- package/dist/useCreation/demo/demo1.js +24 -0
- package/dist/useCreation/index.d.ts +3 -0
- package/dist/useCreation/index.js +17 -0
- package/dist/useDebounceFn/demo/demo1.d.ts +7 -0
- package/dist/useDebounceFn/demo/demo1.js +39 -0
- package/dist/useDebounceFn/demo/demo2.d.ts +7 -0
- package/dist/useDebounceFn/demo/demo2.js +29 -0
- package/dist/useDebounceFn/demo/demo3.d.ts +7 -0
- package/dist/useDebounceFn/demo/demo3.js +30 -0
- package/dist/useDebounceFn/index.d.ts +14 -0
- package/dist/useDebounceFn/index.js +28 -0
- package/dist/useDebounceValue/demo/demo1.d.ts +7 -0
- package/dist/useDebounceValue/demo/demo1.js +31 -0
- package/dist/useDebounceValue/index.d.ts +8 -0
- package/dist/useDebounceValue/index.js +18 -0
- package/dist/useEventEmitter/index.d.ts +2 -0
- package/dist/useEventEmitter/index.js +2 -0
- package/dist/useInterval/demo/demo1.d.ts +7 -0
- package/dist/useInterval/demo/demo1.js +18 -0
- package/dist/useInterval/demo/demo2.d.ts +7 -0
- package/dist/useInterval/demo/demo2.js +45 -0
- package/dist/useInterval/index.d.ts +3 -0
- package/dist/useInterval/index.js +29 -0
- package/dist/useLatest/demo/demo1.d.ts +7 -0
- package/dist/useLatest/demo/demo1.js +38 -0
- package/dist/useLatest/index.d.ts +3 -0
- package/dist/useLatest/index.js +7 -0
- package/dist/useMap/demo/demo1.d.ts +7 -0
- package/dist/useMap/demo/demo1.js +51 -0
- package/dist/useMap/index.d.ts +9 -0
- package/dist/useMap/index.js +46 -0
- package/dist/useMemoizedFn/demo/demo1.d.ts +7 -0
- package/dist/useMemoizedFn/demo/demo1.js +45 -0
- package/dist/useMemoizedFn/demo/demo2.d.ts +3 -0
- package/dist/useMemoizedFn/demo/demo2.js +48 -0
- package/dist/useMemoizedFn/index.d.ts +3 -0
- package/dist/useMemoizedFn/index.js +21 -0
- package/dist/useMount/demo/demo1.d.ts +7 -0
- package/dist/useMount/demo/demo1.js +24 -0
- package/dist/useMount/index.d.ts +2 -0
- package/dist/useMount/index.js +7 -0
- package/dist/useSet/demo/demo1.d.ts +3 -0
- package/dist/useSet/demo/demo1.js +36 -0
- package/dist/useSet/index.d.ts +6 -0
- package/dist/useSet/index.js +41 -0
- package/dist/useThrottleFn/demo/demo1.d.ts +7 -0
- package/dist/useThrottleFn/demo/demo1.js +39 -0
- package/dist/useThrottleFn/demo/demo2.d.ts +7 -0
- package/dist/useThrottleFn/demo/demo2.js +29 -0
- package/dist/useThrottleFn/index.d.ts +13 -0
- package/dist/useThrottleFn/index.js +28 -0
- package/dist/useThrottleValue/demo/demo1.d.ts +7 -0
- package/dist/useThrottleValue/demo/demo1.js +31 -0
- package/dist/useThrottleValue/index.d.ts +7 -0
- package/dist/useThrottleValue/index.js +18 -0
- package/dist/useTimeout/demo/demo1.d.ts +7 -0
- package/dist/useTimeout/demo/demo1.js +19 -0
- package/dist/useTimeout/demo/demo2.d.ts +7 -0
- package/dist/useTimeout/demo/demo2.js +43 -0
- package/dist/useTimeout/index.d.ts +3 -0
- package/dist/useTimeout/index.js +22 -0
- package/dist/useToggle/demo/demo1.d.ts +7 -0
- package/dist/useToggle/demo/demo1.js +32 -0
- package/dist/useToggle/demo/demo2.d.ts +7 -0
- package/dist/useToggle/demo/demo2.js +45 -0
- package/dist/useToggle/demo/demo3.d.ts +7 -0
- package/dist/useToggle/demo/demo3.js +32 -0
- package/dist/useToggle/index.d.ts +10 -0
- package/dist/useToggle/index.js +35 -0
- package/dist/useUnmount/demo/demo1.d.ts +7 -0
- package/dist/useUnmount/demo/demo1.js +24 -0
- package/dist/useUnmount/index.d.ts +2 -0
- package/dist/useUnmount/index.js +13 -0
- package/dist/useUpdate/demo/demo1.d.ts +7 -0
- package/dist/useUpdate/demo/demo1.js +17 -0
- package/dist/useUpdate/index.d.ts +2 -0
- package/dist/useUpdate/index.js +13 -0
- package/dist/utils/isSameDep.d.ts +3 -0
- package/dist/utils/isSameDep.js +7 -0
- package/package.json +81 -0
@@ -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,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,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,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,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,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,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,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,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,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,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,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;
|