@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
package/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) cssheo
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# 什么是 useHooks
|
2
|
+
|
3
|
+
useHooks,是一款为 React 开发场景而生的 Hooks 库。
|
4
|
+
|
5
|
+
## 特性
|
6
|
+
|
7
|
+
全新的 useHooks 主要具备以下特性:
|
8
|
+
|
9
|
+
- 🚀 **易学易用**:直接通过 CDN 或者 npm 即可使用
|
10
|
+
- 🔍 **内置全文搜索**:标题、正文、demo 等内容均可被搜索,支持多关键词搜索
|
11
|
+
- 🎨 **包含丰富的基础 Hooks**:如 useCreation、useLatest 等基础 hooks 为 react 开发赋能
|
12
|
+
- 🚥 **可靠的代码健壮**:使用 Typescript 构建,提供完善的类型定义文件
|
13
|
+
- 💎 **完善的文档能力**:支持文档记录,支持 demo 演示
|
14
|
+
|
15
|
+
## 📦 安装
|
16
|
+
|
17
|
+
:::code-group
|
18
|
+
|
19
|
+
```bash [npm]
|
20
|
+
npm install @csshero/usehooks
|
21
|
+
```
|
22
|
+
|
23
|
+
```bash [yarn]
|
24
|
+
yarn add @csshero/usehooks
|
25
|
+
```
|
26
|
+
|
27
|
+
```bash [pnpm]
|
28
|
+
pnpm add @csshero/usehooks
|
29
|
+
```
|
30
|
+
|
31
|
+
:::
|
32
|
+
|
33
|
+
## 🔨 使用
|
34
|
+
|
35
|
+
```ts
|
36
|
+
import { useToggle } from '@csshero/usehooks';
|
37
|
+
```
|
38
|
+
|
39
|
+
## 问题反馈
|
40
|
+
|
41
|
+
如果在使用过程中发现任何问题、或者有改善建议,欢迎在 GitHub Issues 进行反馈:[issues](https://github.com/CssHeroPhone19301430776/useHooks/issues)
|
42
|
+
|
43
|
+
或添加我的联系方式:
|
44
|
+
|
45
|
+
<div>
|
46
|
+
<img data-type="dingtalk" src="/vx.jpg" width="300" />
|
47
|
+
</div>
|
package/dist/index.d.ts
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
import useBoolean from './useBoolean';
|
2
|
+
import useCreation from './useCreation';
|
3
|
+
import useDebounceFn from './useDebounceFn';
|
4
|
+
import useDebounceValue from './useDebounceValue';
|
5
|
+
import useInterval from './useInterval';
|
6
|
+
import useLatest from './useLatest';
|
7
|
+
import useMap from './useMap';
|
8
|
+
import useMemoizedFn from './useMemoizedFn';
|
9
|
+
import useMount from './useMount';
|
10
|
+
import useSet from './useSet';
|
11
|
+
import useThrottleFn from './useThrottleFn';
|
12
|
+
import useThrottleValue from './useThrottleValue';
|
13
|
+
import useTimeout from './useTimeout';
|
14
|
+
import useToggle from './useToggle';
|
15
|
+
import useUnmount from './useUnmount';
|
16
|
+
import useUpdate from './useUpdate';
|
17
|
+
export { useBoolean, useCreation, useDebounceFn, useDebounceValue, useInterval, useLatest, useMap, useMemoizedFn, useMount, useSet, useThrottleFn, useThrottleValue, useTimeout, useToggle, useUnmount, useUpdate, };
|
package/dist/index.js
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
import useBoolean from "./useBoolean";
|
2
|
+
import useCreation from "./useCreation";
|
3
|
+
import useDebounceFn from "./useDebounceFn";
|
4
|
+
import useDebounceValue from "./useDebounceValue";
|
5
|
+
import useInterval from "./useInterval";
|
6
|
+
import useLatest from "./useLatest";
|
7
|
+
import useMap from "./useMap";
|
8
|
+
import useMemoizedFn from "./useMemoizedFn";
|
9
|
+
import useMount from "./useMount";
|
10
|
+
import useSet from "./useSet";
|
11
|
+
import useThrottleFn from "./useThrottleFn";
|
12
|
+
import useThrottleValue from "./useThrottleValue";
|
13
|
+
import useTimeout from "./useTimeout";
|
14
|
+
import useToggle from "./useToggle";
|
15
|
+
import useUnmount from "./useUnmount";
|
16
|
+
import useUpdate from "./useUpdate";
|
17
|
+
export { useBoolean, useCreation, useDebounceFn, useDebounceValue, useInterval, useLatest, useMap, useMemoizedFn, useMount, useSet, useThrottleFn, useThrottleValue, useTimeout, useToggle, useUnmount, useUpdate };
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
import { useBoolean } from "../..";
|
3
|
+
import React from 'react';
|
4
|
+
var DemoOne = function DemoOne() {
|
5
|
+
var _useBoolean = useBoolean(true),
|
6
|
+
_useBoolean2 = _slicedToArray(_useBoolean, 2),
|
7
|
+
value = _useBoolean2[0],
|
8
|
+
action = _useBoolean2[1];
|
9
|
+
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", null, "Effects: ", value.toString()), /*#__PURE__*/React.createElement("button", {
|
10
|
+
type: "button",
|
11
|
+
onClick: action.toggle
|
12
|
+
}, "toggle"), /*#__PURE__*/React.createElement("button", {
|
13
|
+
type: "button",
|
14
|
+
onClick: action.setTrue,
|
15
|
+
style: {
|
16
|
+
margin: '0 8px'
|
17
|
+
}
|
18
|
+
}, "steTrue"), /*#__PURE__*/React.createElement("button", {
|
19
|
+
type: "button",
|
20
|
+
onClick: action.setFalse
|
21
|
+
}, "setFalse"));
|
22
|
+
};
|
23
|
+
export default DemoOne;
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
import { useState } from 'react';
|
3
|
+
var useBoolean = function useBoolean() {
|
4
|
+
var defaultValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
5
|
+
var _useState = useState(defaultValue),
|
6
|
+
_useState2 = _slicedToArray(_useState, 2),
|
7
|
+
value = _useState2[0],
|
8
|
+
setValue = _useState2[1];
|
9
|
+
var actions = {
|
10
|
+
set: setValue,
|
11
|
+
setTrue: function setTrue() {
|
12
|
+
return setValue(true);
|
13
|
+
},
|
14
|
+
setFalse: function setFalse() {
|
15
|
+
return setValue(false);
|
16
|
+
},
|
17
|
+
toggle: function toggle() {
|
18
|
+
return setValue(function (v) {
|
19
|
+
return !v;
|
20
|
+
});
|
21
|
+
}
|
22
|
+
};
|
23
|
+
return [value, actions];
|
24
|
+
};
|
25
|
+
export default useBoolean;
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
/**
|
3
|
+
* title: 案例
|
4
|
+
* description: 确保实例不会被重复创建,点击 "Rerender" 按钮,触发组件的更新,但 testMemo 的数据会保持不变
|
5
|
+
*/
|
6
|
+
|
7
|
+
import { useCreation } from "../..";
|
8
|
+
import React, { useState } from 'react';
|
9
|
+
export default function () {
|
10
|
+
var testMemo = useCreation(function () {
|
11
|
+
return {
|
12
|
+
info: Math.random()
|
13
|
+
};
|
14
|
+
}, []);
|
15
|
+
var _useState = useState({}),
|
16
|
+
_useState2 = _slicedToArray(_useState, 2),
|
17
|
+
setFlag = _useState2[1];
|
18
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("p", null, testMemo.info), /*#__PURE__*/React.createElement("button", {
|
19
|
+
type: "button",
|
20
|
+
onClick: function onClick() {
|
21
|
+
setFlag({});
|
22
|
+
}
|
23
|
+
}, "Rerender"));
|
24
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { useRef } from 'react';
|
2
|
+
import isSameDep from "../utils/isSameDep";
|
3
|
+
var useCreation = function useCreation(factory, deps) {
|
4
|
+
var _useRef = useRef({
|
5
|
+
obj: null,
|
6
|
+
deps: deps,
|
7
|
+
init: false
|
8
|
+
}),
|
9
|
+
current = _useRef.current;
|
10
|
+
if (!current.init || !isSameDep(current.deps, deps)) {
|
11
|
+
current.obj = factory();
|
12
|
+
current.deps = deps;
|
13
|
+
current.init = true;
|
14
|
+
}
|
15
|
+
return current.obj;
|
16
|
+
};
|
17
|
+
export default useCreation;
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
/**
|
3
|
+
* title: 案例
|
4
|
+
* description: 频繁调用 run,但只会在所有点击完成 2000ms 后执行一次相关函数
|
5
|
+
*/
|
6
|
+
|
7
|
+
import { useDebounceFn } 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 _useDebounceFn = useDebounceFn(function () {
|
15
|
+
setValue(value + 1);
|
16
|
+
}, {
|
17
|
+
wait: 2000
|
18
|
+
}),
|
19
|
+
run = _useDebounceFn.run,
|
20
|
+
cancel = _useDebounceFn.cancel,
|
21
|
+
flush = _useDebounceFn.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\u9632\u6296\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 为 true 当频繁调用 run,会在 第一次点击 和 所有点击完成 2000ms 后各执行一次相关函数
|
5
|
+
*/
|
6
|
+
|
7
|
+
import { useDebounceFn } 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 _useDebounceFn = useDebounceFn(function () {
|
15
|
+
setValue(value + 1);
|
16
|
+
}, {
|
17
|
+
leading: true,
|
18
|
+
wait: 2000
|
19
|
+
}),
|
20
|
+
run = _useDebounceFn.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,30 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
/**
|
3
|
+
* title: 案例
|
4
|
+
* description: 设置 leading 为 true,trailing 为 false 当频繁调用 run,只会在 第一次点击 后执行一次相关函数 然后等待2000ms
|
5
|
+
*/
|
6
|
+
|
7
|
+
import { useDebounceFn } 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 _useDebounceFn = useDebounceFn(function () {
|
15
|
+
setValue(value + 1);
|
16
|
+
}, {
|
17
|
+
leading: true,
|
18
|
+
trailing: false,
|
19
|
+
wait: 2000
|
20
|
+
}),
|
21
|
+
run = _useDebounceFn.run;
|
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"));
|
30
|
+
});
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import _ from 'lodash-es';
|
2
|
+
interface Option {
|
3
|
+
wait?: number;
|
4
|
+
leading?: boolean;
|
5
|
+
trailing?: boolean;
|
6
|
+
maxWait?: number;
|
7
|
+
}
|
8
|
+
type FnType = (...args: any[]) => any;
|
9
|
+
declare const useDebounceFn: (callback: FnType, option: Option) => {
|
10
|
+
run: _.DebouncedFunc<(...args: any) => void>;
|
11
|
+
cancel: () => void;
|
12
|
+
flush: () => void | undefined;
|
13
|
+
};
|
14
|
+
export default useDebounceFn;
|
@@ -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 useDebounceFn = function useDebounceFn(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 : false;
|
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 debounce = useCreation(function () {
|
15
|
+
return _.debounce(function () {
|
16
|
+
callbackRef.current.apply(callbackRef, arguments);
|
17
|
+
}, option.wait, option);
|
18
|
+
}, []);
|
19
|
+
useUnmount(function () {
|
20
|
+
debounce.cancel();
|
21
|
+
});
|
22
|
+
return {
|
23
|
+
run: debounce,
|
24
|
+
cancel: debounce.cancel,
|
25
|
+
flush: debounce.flush
|
26
|
+
};
|
27
|
+
};
|
28
|
+
export default useDebounceFn;
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
/**
|
3
|
+
* title: 案例
|
4
|
+
* description: debounceValue 每隔 1000ms 变化一次。
|
5
|
+
*/
|
6
|
+
|
7
|
+
import { useDebounceValue } 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 debounceValue = useDebounceValue(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\u6539debounceValue",
|
23
|
+
style: {
|
24
|
+
width: 280
|
25
|
+
}
|
26
|
+
}), /*#__PURE__*/React.createElement("p", {
|
27
|
+
style: {
|
28
|
+
marginTop: 16
|
29
|
+
}
|
30
|
+
}, "debounceValue: ", debounceValue));
|
31
|
+
});
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
import { useEffect, useState } from 'react';
|
3
|
+
import useDebounceFn from "../useDebounceFn";
|
4
|
+
var useDebounceValue = function useDebounceValue(value, options) {
|
5
|
+
var _useState = useState(value),
|
6
|
+
_useState2 = _slicedToArray(_useState, 2),
|
7
|
+
debouncedValue = _useState2[0],
|
8
|
+
setDebouncedValue = _useState2[1];
|
9
|
+
var _useDebounceFn = useDebounceFn(function () {
|
10
|
+
setDebouncedValue(value);
|
11
|
+
}, options),
|
12
|
+
run = _useDebounceFn.run;
|
13
|
+
useEffect(function () {
|
14
|
+
run();
|
15
|
+
}, [value]);
|
16
|
+
return debouncedValue;
|
17
|
+
};
|
18
|
+
export default useDebounceValue;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
/**
|
3
|
+
* title: 案例
|
4
|
+
* description: 立即执行一次,每1000ms,执行一次
|
5
|
+
*/
|
6
|
+
|
7
|
+
import { useInterval } from "../..";
|
8
|
+
import React, { 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
|
+
useInterval(function () {
|
15
|
+
setCount(count + 1);
|
16
|
+
}, 1000, true);
|
17
|
+
return /*#__PURE__*/React.createElement("div", null, "count: ", count);
|
18
|
+
});
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
/**
|
3
|
+
* title: 案例
|
4
|
+
* description: 动态修改 delay 以实现定时器间隔变化与暂停。
|
5
|
+
*/
|
6
|
+
|
7
|
+
import { useInterval } from "../..";
|
8
|
+
import React, { 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(1000),
|
15
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
16
|
+
interval = _useState4[0],
|
17
|
+
setInterval = _useState4[1];
|
18
|
+
var clear = useInterval(function () {
|
19
|
+
setCount(count + 1);
|
20
|
+
}, interval);
|
21
|
+
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("p", null, " count: ", count, " "), /*#__PURE__*/React.createElement("p", {
|
22
|
+
style: {
|
23
|
+
marginTop: 16
|
24
|
+
}
|
25
|
+
}, " interval: ", interval, " "), /*#__PURE__*/React.createElement("button", {
|
26
|
+
type: "button",
|
27
|
+
onClick: function onClick() {
|
28
|
+
return setInterval(interval + 1000);
|
29
|
+
},
|
30
|
+
style: {
|
31
|
+
marginRight: 8
|
32
|
+
}
|
33
|
+
}, "interval + 1000"), /*#__PURE__*/React.createElement("button", {
|
34
|
+
type: "button",
|
35
|
+
style: {
|
36
|
+
marginRight: 8
|
37
|
+
},
|
38
|
+
onClick: function onClick() {
|
39
|
+
setInterval(1000);
|
40
|
+
}
|
41
|
+
}, "reset interval"), /*#__PURE__*/React.createElement("button", {
|
42
|
+
type: "button",
|
43
|
+
onClick: clear
|
44
|
+
}, "clear"));
|
45
|
+
});
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
2
|
+
var useInterval = function useInterval(callback) {
|
3
|
+
var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
|
4
|
+
var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
5
|
+
var timerRef = useRef();
|
6
|
+
var callbackRef = useRef(callback); // 用于保存最新的 callback
|
7
|
+
|
8
|
+
var clearFn = useCallback(function () {
|
9
|
+
if (timerRef.current) {
|
10
|
+
clearInterval(timerRef.current);
|
11
|
+
}
|
12
|
+
}, []);
|
13
|
+
|
14
|
+
// 每次渲染时更新 callbackRef 的值
|
15
|
+
useEffect(function () {
|
16
|
+
callbackRef.current = callback;
|
17
|
+
}, [callback]);
|
18
|
+
useEffect(function () {
|
19
|
+
if (immediate) {
|
20
|
+
callbackRef.current();
|
21
|
+
}
|
22
|
+
timerRef.current = setInterval(function () {
|
23
|
+
callbackRef.current(); // 每次都读取最新的 callback
|
24
|
+
}, delay);
|
25
|
+
return clearFn;
|
26
|
+
}, [delay]);
|
27
|
+
return clearFn;
|
28
|
+
};
|
29
|
+
export default useInterval;
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2
|
+
/**
|
3
|
+
* title: 案例
|
4
|
+
* description: useLatest 返回的永远是最新值
|
5
|
+
*/
|
6
|
+
|
7
|
+
import { useLatest } from "../..";
|
8
|
+
import React, { useEffect, 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(0),
|
15
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
16
|
+
count2 = _useState4[0],
|
17
|
+
setCount2 = _useState4[1];
|
18
|
+
var latestCountRef = useLatest(count);
|
19
|
+
useEffect(function () {
|
20
|
+
var interval = setInterval(function () {
|
21
|
+
// 获取到最新的 count 值然后+1
|
22
|
+
setCount(latestCountRef.current + 1);
|
23
|
+
}, 1000);
|
24
|
+
return function () {
|
25
|
+
return clearInterval(interval);
|
26
|
+
};
|
27
|
+
}, []);
|
28
|
+
useEffect(function () {
|
29
|
+
var interval = setInterval(function () {
|
30
|
+
// 因为闭包陷阱,count2 访问时永远都是 0
|
31
|
+
setCount2(count2 + 1);
|
32
|
+
}, 1000);
|
33
|
+
return function () {
|
34
|
+
return clearInterval(interval);
|
35
|
+
};
|
36
|
+
}, []);
|
37
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("p", null, "count(useLatest): ", count), /*#__PURE__*/React.createElement("p", null, "count(defult): ", count2));
|
38
|
+
});
|