Commit 2037293aa3b38ad8dc9bee4324647cb1484c1a9a

Authored by Vben
1 parent 215d8bab

refactor: refactor hooks

CHANGELOG.zh_CN.md
1 ## Wip 1 ## Wip
2 2
  3 +## (破坏性更新) Breaking changes
  4 +
  5 +- 使用 `pinia` 替换 `vuex`,`vuex-module-decorators`。
  6 +
  7 + - 影响,之前如果有自己使用 vuex-module-decorators,需要改造为 pinia。
  8 + - 原因:
  9 + - pinia 于 vuex5api 基本类似,且简单易懂。
  10 + - 后续切换 vuex5 成本非常低,也可以当作第三方状态管理库使用
  11 +
  12 +- 移除 `useKeyPress` 使用`vueuse`-`onKeyStroke`代替
  13 +- 移除 `useDebounceFn` 使用`vueuse`-`useDebounceFn`代替
  14 +- 移除 `useThrottle` 使用`vueuse`-`useThrottleFn`代替
  15 +
  16 +### ✨ Refactor
  17 +
  18 +- 移除 `useElResize`
  19 +
3 ### 🐛 Bug Fixes 20 ### 🐛 Bug Fixes
4 21
5 - 登录页样式修复 22 - 登录页样式修复
src/components/Application/src/search/useMenuSearch.ts
@@ -3,15 +3,13 @@ import type { Menu } from '/@/router/types'; @@ -3,15 +3,13 @@ import type { Menu } from '/@/router/types';
3 import { ref, onBeforeMount, unref, Ref, nextTick } from 'vue'; 3 import { ref, onBeforeMount, unref, Ref, nextTick } from 'vue';
4 4
5 import { getMenus } from '/@/router/menus'; 5 import { getMenus } from '/@/router/menus';
6 -import { KeyCodeEnum } from '/@/enums/keyCodeEnum';  
7 6
8 import { cloneDeep } from 'lodash-es'; 7 import { cloneDeep } from 'lodash-es';
9 import { filter, forEach } from '/@/utils/helper/treeHelper'; 8 import { filter, forEach } from '/@/utils/helper/treeHelper';
10 9
11 -import { useDebounce } from '/@/hooks/core/useDebounce';  
12 import { useGo } from '/@/hooks/web/usePage'; 10 import { useGo } from '/@/hooks/web/usePage';
13 import { useScrollTo } from '/@/hooks/event/useScrollTo'; 11 import { useScrollTo } from '/@/hooks/event/useScrollTo';
14 -import { useKeyPress } from '/@/hooks/event/useKeyPress'; 12 +import { onKeyStroke, useDebounceFn } from '@vueuse/core';
15 import { useI18n } from '/@/hooks/web/useI18n'; 13 import { useI18n } from '/@/hooks/web/useI18n';
16 14
17 export interface SearchResult { 15 export interface SearchResult {
@@ -41,7 +39,7 @@ export function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>, @@ -41,7 +39,7 @@ export function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>,
41 39
42 const { t } = useI18n(); 40 const { t } = useI18n();
43 const go = useGo(); 41 const go = useGo();
44 - const [handleSearch] = useDebounce(search, 200); 42 + const handleSearch = useDebounceFn(search, 200);
45 43
46 onBeforeMount(async () => { 44 onBeforeMount(async () => {
47 const list = await getMenus(); 45 const list = await getMenus();
@@ -146,23 +144,10 @@ export function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>, @@ -146,23 +144,10 @@ export function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>,
146 emit('close'); 144 emit('close');
147 } 145 }
148 146
149 - useKeyPress(['enter', 'up', 'down', 'esc'], (events) => {  
150 - const keyCode = events.keyCode;  
151 - switch (keyCode) {  
152 - case KeyCodeEnum.UP:  
153 - handleUp();  
154 - break;  
155 - case KeyCodeEnum.DOWN:  
156 - handleDown();  
157 - break;  
158 - case KeyCodeEnum.ENTER:  
159 - handleEnter();  
160 - break;  
161 - case KeyCodeEnum.ESC:  
162 - handleClose();  
163 - break;  
164 - }  
165 - }); 147 + onKeyStroke('Enter', handleEnter);
  148 + onKeyStroke('ArrowUp', handleUp);
  149 + onKeyStroke('ArrowDown', handleDown);
  150 + onKeyStroke('Escape', handleClose);
166 151
167 return { handleSearch, searchResult, keyword, activeIndex, handleMouseenter, handleEnter }; 152 return { handleSearch, searchResult, keyword, activeIndex, handleMouseenter, handleEnter };
168 } 153 }
src/components/Icon/src/IconPicker.vue
@@ -76,7 +76,7 @@ @@ -76,7 +76,7 @@
76 import iconsData from '../data/icons.data'; 76 import iconsData from '../data/icons.data';
77 import { propTypes } from '/@/utils/propTypes'; 77 import { propTypes } from '/@/utils/propTypes';
78 import { usePagination } from '/@/hooks/web/usePagination'; 78 import { usePagination } from '/@/hooks/web/usePagination';
79 - import { useDebounce } from '/@/hooks/core/useDebounce'; 79 + import { useDebounceFn } from '@vueuse/core';
80 import { useI18n } from '/@/hooks/web/useI18n'; 80 import { useI18n } from '/@/hooks/web/useI18n';
81 import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; 81 import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
82 import { useMessage } from '/@/hooks/web/useMessage'; 82 import { useMessage } from '/@/hooks/web/useMessage';
@@ -123,7 +123,7 @@ @@ -123,7 +123,7 @@
123 const { t } = useI18n(); 123 const { t } = useI18n();
124 const { prefixCls } = useDesign('icon-picker'); 124 const { prefixCls } = useDesign('icon-picker');
125 125
126 - const [debounceHandleSearchChange] = useDebounce(handleSearchChange, 100); 126 + const debounceHandleSearchChange = useDebounceFn(handleSearchChange, 100);
127 const { clipboardRef, isSuccessRef } = useCopyToClipboard(props.value); 127 const { clipboardRef, isSuccessRef } = useCopyToClipboard(props.value);
128 const { createMessage } = useMessage(); 128 const { createMessage } = useMessage();
129 129
src/components/Modal/src/components/ModalWrapper.vue
@@ -24,7 +24,6 @@ @@ -24,7 +24,6 @@
24 import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn'; 24 import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
25 import { ScrollContainer } from '/@/components/Container'; 25 import { ScrollContainer } from '/@/components/Container';
26 26
27 - // import { useElResize } from '/@/hooks/event/useElResize';  
28 import { propTypes } from '/@/utils/propTypes'; 27 import { propTypes } from '/@/utils/propTypes';
29 import { createModalContext } from '../hooks/useModalContext'; 28 import { createModalContext } from '../hooks/useModalContext';
30 29
src/components/SimpleMenu/src/useOpenKeys.ts
@@ -8,7 +8,7 @@ import { uniq } from 'lodash-es'; @@ -8,7 +8,7 @@ import { uniq } from 'lodash-es';
8 import { getAllParentPath } from '/@/router/helper/menuHelper'; 8 import { getAllParentPath } from '/@/router/helper/menuHelper';
9 9
10 import { useTimeoutFn } from '/@/hooks/core/useTimeout'; 10 import { useTimeoutFn } from '/@/hooks/core/useTimeout';
11 -import { useDebounce } from '/@/hooks/core/useDebounce'; 11 +import { useDebounceFn } from '@vueuse/core';
12 12
13 export function useOpenKeys( 13 export function useOpenKeys(
14 menuState: MenuState, 14 menuState: MenuState,
@@ -17,7 +17,7 @@ export function useOpenKeys( @@ -17,7 +17,7 @@ export function useOpenKeys(
17 mixSider: Ref<boolean>, 17 mixSider: Ref<boolean>,
18 collapse: Ref<boolean> 18 collapse: Ref<boolean>
19 ) { 19 ) {
20 - const [debounceSetOpenKeys] = useDebounce(setOpenKeys, 50); 20 + const debounceSetOpenKeys = useDebounceFn(setOpenKeys, 50);
21 async function setOpenKeys(path: string) { 21 async function setOpenKeys(path: string) {
22 const native = !mixSider.value; 22 const native = !mixSider.value;
23 const menuList = toRaw(menus.value); 23 const menuList = toRaw(menus.value);
src/components/Table/src/hooks/useTableScroll.ts
1 -import type { BasicTableProps, TableRowSelection } from '../types/table'; 1 +import type { BasicTableProps, TableRowSelection, BasicColumn } from '../types/table';
2 import type { Ref, ComputedRef } from 'vue'; 2 import type { Ref, ComputedRef } from 'vue';
  3 +
3 import { computed, unref, ref, nextTick, watch } from 'vue'; 4 import { computed, unref, ref, nextTick, watch } from 'vue';
4 5
5 import { getViewportOffset } from '/@/utils/domUtils'; 6 import { getViewportOffset } from '/@/utils/domUtils';
@@ -7,9 +8,8 @@ import { isBoolean } from &#39;/@/utils/is&#39;; @@ -7,9 +8,8 @@ import { isBoolean } from &#39;/@/utils/is&#39;;
7 8
8 import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn'; 9 import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
9 import { useModalContext } from '/@/components/Modal'; 10 import { useModalContext } from '/@/components/Modal';
10 -import { useDebounce } from '/@/hooks/core/useDebounce';  
11 -import type { BasicColumn } from '/@/components/Table';  
12 import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'; 11 import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';
  12 +import { useDebounceFn } from '@vueuse/core';
13 13
14 export function useTableScroll( 14 export function useTableScroll(
15 propsRef: ComputedRef<BasicTableProps>, 15 propsRef: ComputedRef<BasicTableProps>,
@@ -23,7 +23,7 @@ export function useTableScroll( @@ -23,7 +23,7 @@ export function useTableScroll(
23 const modalFn = useModalContext(); 23 const modalFn = useModalContext();
24 24
25 // Greater than animation time 280 25 // Greater than animation time 280
26 - const [debounceRedoHeight] = useDebounce(redoHeight, 100); 26 + const debounceRedoHeight = useDebounceFn(redoHeight, 100);
27 27
28 const getCanResize = computed(() => { 28 const getCanResize = computed(() => {
29 const { canResize, scroll } = unref(propsRef); 29 const { canResize, scroll } = unref(propsRef);
src/components/Tree/src/TreeHeader.vue
@@ -41,7 +41,7 @@ @@ -41,7 +41,7 @@
41 import { propTypes } from '/@/utils/propTypes'; 41 import { propTypes } from '/@/utils/propTypes';
42 42
43 import { useI18n } from '/@/hooks/web/useI18n'; 43 import { useI18n } from '/@/hooks/web/useI18n';
44 - import { useDebounce } from '/@/hooks/core/useDebounce'; 44 + import { useDebounceFn } from '@vueuse/core';
45 45
46 import { ToolbarEnum } from './enum'; 46 import { ToolbarEnum } from './enum';
47 47
@@ -128,7 +128,7 @@ @@ -128,7 +128,7 @@
128 function emitChange(value?: string): void { 128 function emitChange(value?: string): void {
129 emit('search', value); 129 emit('search', value);
130 } 130 }
131 - const [debounceEmitChange] = useDebounce(emitChange, 200); 131 + const debounceEmitChange = useDebounceFn(emitChange, 200);
132 132
133 function handleSearch(e: ChangeEvent): void { 133 function handleSearch(e: ChangeEvent): void {
134 debounceEmitChange(e.target.value); 134 debounceEmitChange(e.target.value);
src/enums/keyCodeEnum.ts deleted 100644 → 0
1 -export const enum KeyCodeEnum {  
2 - UP = 38,  
3 - DOWN = 40,  
4 - ENTER = 13,  
5 - ESC = 27,  
6 -}  
src/hooks/core/useContext.ts
@@ -29,19 +29,7 @@ export function createContext&lt;T&gt;( @@ -29,19 +29,7 @@ export function createContext&lt;T&gt;(
29 const provideData = readonly ? defineReadonly(state) : state; 29 const provideData = readonly ? defineReadonly(state) : state;
30 !createProvider && provide(key, native ? context : provideData); 30 !createProvider && provide(key, native ? context : provideData);
31 31
32 - // const Provider = createProvider  
33 - // ? defineComponent({  
34 - // name: 'Provider',  
35 - // inheritAttrs: false,  
36 - // setup(_, { slots }) {  
37 - // provide(key, provideData);  
38 - // return () => slots.default?.();  
39 - // },  
40 - // })  
41 - // : null;  
42 -  
43 return { 32 return {
44 - // Provider,  
45 state, 33 state,
46 }; 34 };
47 } 35 }
src/hooks/core/useDebounce.ts deleted 100644 → 0
1 -export interface DebounceAndThrottleOptions {  
2 - // 立即执行  
3 - immediate?: boolean;  
4 -  
5 - // 是否为debounce  
6 - debounce?: boolean;  
7 - // 只执行一次  
8 - once?: boolean;  
9 -}  
10 -export type CancelFn = () => void;  
11 -  
12 -export type DebounceAndThrottleProcedure<T extends unknown[]> = (...args: T) => unknown;  
13 -  
14 -export type DebounceAndThrottleProcedureResult<T extends unknown[]> = [  
15 - DebounceAndThrottleProcedure<T>,  
16 - CancelFn  
17 -];  
18 -  
19 -import {  
20 - // throttle,  
21 - useThrottle,  
22 -} from './useThrottle';  
23 -  
24 -/**  
25 - * @description: Applicable in components  
26 - */  
27 -export function useDebounce<T extends unknown[]>(  
28 - handle: DebounceAndThrottleProcedure<T>,  
29 - wait: number,  
30 - options: DebounceAndThrottleOptions = {}  
31 -): DebounceAndThrottleProcedureResult<T> {  
32 - return useThrottle(  
33 - handle,  
34 - wait,  
35 - Object.assign(options, {  
36 - debounce: true,  
37 - })  
38 - );  
39 -}  
src/hooks/core/useThrottle.ts deleted 100644 → 0
1 -export interface DebounceAndThrottleOptions {  
2 - // 立即执行  
3 - immediate?: boolean;  
4 -  
5 - // 是否为debounce  
6 - debounce?: boolean;  
7 - // 只执行一次  
8 - once?: boolean;  
9 -}  
10 -export type CancelFn = () => void;  
11 -  
12 -export type DebounceAndThrottleProcedure<T extends unknown[]> = (...args: T) => unknown;  
13 -  
14 -export type DebounceAndThrottleProcedureResult<T extends unknown[]> = [  
15 - DebounceAndThrottleProcedure<T>,  
16 - CancelFn  
17 -];  
18 -  
19 -import { isFunction } from '/@/utils/is';  
20 -export function throttle<T extends unknown[]>(  
21 - handle: DebounceAndThrottleProcedure<T>,  
22 - wait: number,  
23 - options: DebounceAndThrottleOptions = {}  
24 -): DebounceAndThrottleProcedureResult<T> {  
25 - if (!isFunction(handle)) {  
26 - throw new Error('handle is not Function!');  
27 - }  
28 - let { immediate = false } = options;  
29 - const { once = false, debounce = false } = options;  
30 - let timeoutId: Nullable<TimeoutHandle>;  
31 - // Has it been cancelled  
32 - let cancelled: boolean | null = false;  
33 - /**  
34 - * @description: clear timer  
35 - */  
36 - function clearTimer() {  
37 - if (timeoutId) {  
38 - window.clearTimeout(timeoutId);  
39 - timeoutId = null;  
40 - }  
41 - }  
42 - /** cancel exec */  
43 - function cancel() {  
44 - clearTimer();  
45 - cancelled = true;  
46 - }  
47 - // If once is true, only execute once  
48 - function cancelExec(): void {  
49 - once && cancel();  
50 - }  
51 - function fn(this: unknown, ...args: T) {  
52 - // If it has been cancelled, it will not be executed  
53 - if (cancelled) {  
54 - return;  
55 - }  
56 - const exec = () => {  
57 - !debounce && clearTimer();  
58 - handle.apply(this, args);  
59 - cancelExec();  
60 - };  
61 - if (immediate) {  
62 - immediate = false;  
63 - const callNow = !timeoutId;  
64 - if (callNow) {  
65 - exec();  
66 - timeoutId = null;  
67 - }  
68 - } else {  
69 - debounce && clearTimer();  
70 - if (!timeoutId || debounce) {  
71 - timeoutId = setTimeout(exec, wait);  
72 - }  
73 - }  
74 - }  
75 - return [fn, cancel];  
76 -}  
77 -  
78 -export function useThrottle<T extends unknown[]>(  
79 - handle: DebounceAndThrottleProcedure<T>,  
80 - wait: number,  
81 - options: DebounceAndThrottleOptions = {}  
82 -): DebounceAndThrottleProcedureResult<T> {  
83 - return throttle(handle, wait, options);  
84 -}  
src/hooks/event/useElResize.ts deleted 100644 → 0
1 -import { useDebounce } from '/@/hooks/core/useDebounce';  
2 -import { addResizeListener, removeResizeListener } from '/@/utils/event';  
3 -  
4 -interface WindowSizeOptions {  
5 - once?: boolean;  
6 - immediate?: boolean;  
7 -}  
8 -  
9 -export function useElResize<T>(  
10 - el: Element | typeof window,  
11 - fn: Fn<T>,  
12 - wait = 100,  
13 - options?: WindowSizeOptions  
14 -) {  
15 - let handler = () => {  
16 - fn();  
17 - };  
18 - const [handleSize, cancel] = useDebounce(handler, wait, options);  
19 - handler = wait ? handleSize : handler;  
20 -  
21 - function start() {  
22 - addResizeListener(el, handler);  
23 - }  
24 - function stop() {  
25 - removeResizeListener(el, handler);  
26 - cancel();  
27 - }  
28 -  
29 - return [start, stop];  
30 -}  
src/hooks/event/useEventListener.ts
1 import type { Ref } from 'vue'; 1 import type { Ref } from 'vue';
2 2
3 import { ref, watch, unref } from 'vue'; 3 import { ref, watch, unref } from 'vue';
4 -import { useDebounce } from '/@/hooks/core/useDebounce';  
5 -import { useThrottle } from '/@/hooks/core/useThrottle'; 4 +import { useThrottleFn, useDebounceFn } from '@vueuse/core';
6 5
7 export type RemoveEventFn = () => void; 6 export type RemoveEventFn = () => void;
8 7
@@ -31,7 +30,7 @@ export function useEventListener({ @@ -31,7 +30,7 @@ export function useEventListener({
31 if (el) { 30 if (el) {
32 const element: Ref<Element> = ref(el as Element); 31 const element: Ref<Element> = ref(el as Element);
33 32
34 - const [handler] = isDebounce ? useDebounce(listener, wait) : useThrottle(listener, wait); 33 + const handler = isDebounce ? useDebounceFn(listener, wait) : useThrottleFn(listener, wait);
35 const realHandler = wait ? handler : listener; 34 const realHandler = wait ? handler : listener;
36 const removeEventListener = (e: Element) => { 35 const removeEventListener = (e: Element) => {
37 isAddRef.value = true; 36 isAddRef.value = true;
src/hooks/event/useKeyPress.ts deleted 100644 → 0
1 -// https://ahooks.js.org/zh-CN/hooks/dom/use-key-press  
2 -  
3 -import type { Ref } from 'vue';  
4 -import { onBeforeUnmount, onMounted, unref } from 'vue';  
5 -import { noop } from '/@/utils';  
6 -import { isFunction, isString, isNumber, isArray } from '/@/utils/is';  
7 -  
8 -export type KeyPredicate = (event: KeyboardEvent) => boolean;  
9 -export type keyType = KeyboardEvent['keyCode'] | KeyboardEvent['key'];  
10 -export type KeyFilter = keyType | keyType[] | ((event: KeyboardEvent) => boolean);  
11 -export type EventHandler = (event: KeyboardEvent) => void;  
12 -  
13 -export type keyEvent = 'keydown' | 'keyup';  
14 -  
15 -export type TargetElement = HTMLElement | Element | Document | Window;  
16 -export type Target = Ref<TargetElement>;  
17 -  
18 -export type EventOption = {  
19 - events?: keyEvent[];  
20 - target?: Target;  
21 -};  
22 -  
23 -const defaultEvents: keyEvent[] = ['keydown'];  
24 -  
25 -// 键盘事件 keyCode 别名  
26 -const aliasKeyCodeMap: Recordable<number | number[]> = {  
27 - esc: 27,  
28 - tab: 9,  
29 - enter: 13,  
30 - space: 32,  
31 - up: 38,  
32 - left: 37,  
33 - right: 39,  
34 - down: 40,  
35 - delete: [8, 46],  
36 -};  
37 -  
38 -// 键盘事件 key 别名  
39 -const aliasKeyMap: Recordable<string | string[]> = {  
40 - esc: 'Escape',  
41 - tab: 'Tab',  
42 - enter: 'Enter',  
43 - space: ' ',  
44 - // IE11 uses key names without `Arrow` prefix for arrow keys.  
45 - up: ['Up', 'ArrowUp'],  
46 - left: ['Left', 'ArrowLeft'],  
47 - right: ['Right', 'ArrowRight'],  
48 - down: ['Down', 'ArrowDown'],  
49 - delete: ['Backspace', 'Delete'],  
50 -};  
51 -  
52 -// 修饰键  
53 -const modifierKey: Recordable<(event: KeyboardEvent) => boolean> = {  
54 - ctrl: (event: KeyboardEvent) => event.ctrlKey,  
55 - shift: (event: KeyboardEvent) => event.shiftKey,  
56 - alt: (event: KeyboardEvent) => event.altKey,  
57 - meta: (event: KeyboardEvent) => event.metaKey,  
58 -};  
59 -  
60 -/**  
61 - * 判断按键是否激活  
62 - * @param [event: KeyboardEvent]键盘事件  
63 - * @param [keyFilter: any] 当前键  
64 - * @returns Boolean  
65 - */  
66 -function genFilterKey(event: any, keyFilter: any) {  
67 - // 浏览器自动补全 input 的时候,会触发 keyDown、keyUp 事件,但此时 event.key 等为空  
68 - if (!event.key) {  
69 - return false;  
70 - }  
71 -  
72 - // 数字类型直接匹配事件的 keyCode  
73 - if (isNumber(keyFilter)) {  
74 - return event.keyCode === keyFilter;  
75 - }  
76 - // 字符串依次判断是否有组合键  
77 - const genArr = keyFilter.split('.');  
78 - let genLen = 0;  
79 - for (const key of genArr) {  
80 - // 组合键  
81 - const genModifier = modifierKey[key];  
82 - // key 别名  
83 - const aliasKey = aliasKeyMap[key];  
84 - // keyCode 别名  
85 - const aliasKeyCode = aliasKeyCodeMap[key];  
86 - /**  
87 - * 满足以上规则  
88 - * 1. 自定义组合键别名  
89 - * 2. 自定义 key 别名  
90 - * 3. 自定义 keyCode 别名  
91 - * 4. 匹配 key 或 keyCode  
92 - */  
93 - if (  
94 - (genModifier && genModifier(event)) ||  
95 - (aliasKey && isArray(aliasKey) ? aliasKey.includes(event.key) : aliasKey === event.key) ||  
96 - (aliasKeyCode && isArray(aliasKeyCode)  
97 - ? aliasKeyCode.includes(event.keyCode)  
98 - : aliasKeyCode === event.keyCode) ||  
99 - event.key.toUpperCase() === key.toUpperCase()  
100 - ) {  
101 - genLen++;  
102 - }  
103 - }  
104 - return genLen === genArr.length;  
105 -}  
106 -  
107 -/**  
108 - * 键盘输入预处理方法  
109 - */  
110 -function genKeyFormat(keyFilter: any): KeyPredicate {  
111 - if (isFunction(keyFilter)) {  
112 - return keyFilter;  
113 - }  
114 - if (isString(keyFilter) || isNumber(keyFilter)) {  
115 - return (event: KeyboardEvent) => genFilterKey(event, keyFilter);  
116 - }  
117 - if (isArray(keyFilter)) {  
118 - return (event: KeyboardEvent) => keyFilter.some((item: any) => genFilterKey(event, item));  
119 - }  
120 - return keyFilter ? () => true : () => false;  
121 -}  
122 -  
123 -export function useKeyPress(  
124 - keyFilter: KeyFilter,  
125 - eventHandler: EventHandler = noop,  
126 - option: EventOption = {}  
127 -) {  
128 - const { events = defaultEvents, target } = option;  
129 -  
130 - let el: TargetElement | null | undefined;  
131 -  
132 - function handler(event: any) {  
133 - const genGuard: KeyPredicate = genKeyFormat(keyFilter);  
134 - if (genGuard(event)) {  
135 - return eventHandler(event);  
136 - }  
137 - }  
138 -  
139 - onMounted(() => {  
140 - el = getTargetElement(target, window);  
141 - if (!el) return;  
142 -  
143 - for (const eventName of events) {  
144 - el.addEventListener(eventName, handler);  
145 - }  
146 - });  
147 -  
148 - onBeforeUnmount(() => {  
149 - if (!el) return;  
150 - for (const eventName of events) {  
151 - el.removeEventListener(eventName, handler);  
152 - }  
153 - });  
154 -}  
155 -  
156 -export function getTargetElement(  
157 - target?: Target,  
158 - defaultElement?: TargetElement  
159 -): TargetElement | undefined | null {  
160 - if (!target) {  
161 - return defaultElement;  
162 - }  
163 - return isFunction(target) ? target() : unref(target);  
164 -}  
src/hooks/event/useScroll.ts
1 import type { Ref } from 'vue'; 1 import type { Ref } from 'vue';
2 2
3 import { ref, onMounted, watch, onUnmounted } from 'vue'; 3 import { ref, onMounted, watch, onUnmounted } from 'vue';
4 -import { useThrottle } from '/@/hooks/core/useThrottle';  
5 import { isWindow, isObject } from '/@/utils/is'; 4 import { isWindow, isObject } from '/@/utils/is';
  5 +import { useThrottleFn } from '@vueuse/core';
6 6
7 export function useScroll( 7 export function useScroll(
8 refEl: Ref<Element | Window | null>, 8 refEl: Ref<Element | Window | null>,
@@ -31,8 +31,7 @@ export function useScroll( @@ -31,8 +31,7 @@ export function useScroll(
31 Reflect.deleteProperty(options, 'wait'); 31 Reflect.deleteProperty(options, 'wait');
32 } 32 }
33 33
34 - const [throttleHandle] = useThrottle(handler, wait);  
35 - handler = throttleHandle; 34 + handler = useThrottleFn(handler, wait);
36 } 35 }
37 36
38 let stopWatch: () => void; 37 let stopWatch: () => void;
src/hooks/event/useWindowSizeFn.ts
1 import { tryOnMounted, tryOnUnmounted } from '@vueuse/core'; 1 import { tryOnMounted, tryOnUnmounted } from '@vueuse/core';
2 -import { useDebounce } from '/@/hooks/core/useDebounce'; 2 +import { useDebounceFn } from '@vueuse/core';
3 3
4 interface WindowSizeOptions { 4 interface WindowSizeOptions {
5 once?: boolean; 5 once?: boolean;
@@ -11,7 +11,7 @@ export function useWindowSizeFn&lt;T&gt;(fn: Fn&lt;T&gt;, wait = 150, options?: WindowSizeOp @@ -11,7 +11,7 @@ export function useWindowSizeFn&lt;T&gt;(fn: Fn&lt;T&gt;, wait = 150, options?: WindowSizeOp
11 let handler = () => { 11 let handler = () => {
12 fn(); 12 fn();
13 }; 13 };
14 - const [handleSize, cancel] = useDebounce(handler, wait, options); 14 + const handleSize = useDebounceFn(handler, wait);
15 handler = handleSize; 15 handler = handleSize;
16 16
17 const start = () => { 17 const start = () => {
@@ -23,7 +23,6 @@ export function useWindowSizeFn&lt;T&gt;(fn: Fn&lt;T&gt;, wait = 150, options?: WindowSizeOp @@ -23,7 +23,6 @@ export function useWindowSizeFn&lt;T&gt;(fn: Fn&lt;T&gt;, wait = 150, options?: WindowSizeOp
23 23
24 const stop = () => { 24 const stop = () => {
25 window.removeEventListener('resize', handler); 25 window.removeEventListener('resize', handler);
26 - cancel();  
27 }; 26 };
28 27
29 tryOnMounted(() => { 28 tryOnMounted(() => {
src/hooks/web/useEcharts/index.ts
@@ -4,7 +4,7 @@ import type { Ref } from &#39;vue&#39;; @@ -4,7 +4,7 @@ import type { Ref } from &#39;vue&#39;;
4 import { useTimeoutFn } from '/@/hooks/core/useTimeout'; 4 import { useTimeoutFn } from '/@/hooks/core/useTimeout';
5 import { tryOnUnmounted } from '@vueuse/core'; 5 import { tryOnUnmounted } from '@vueuse/core';
6 import { unref, nextTick, watch, computed, ref } from 'vue'; 6 import { unref, nextTick, watch, computed, ref } from 'vue';
7 -import { useDebounce } from '/@/hooks/core/useDebounce'; 7 +import { useDebounceFn } from '@vueuse/core';
8 import { useEventListener } from '/@/hooks/event/useEventListener'; 8 import { useEventListener } from '/@/hooks/event/useEventListener';
9 import { useBreakpoint } from '/@/hooks/event/useBreakpoint'; 9 import { useBreakpoint } from '/@/hooks/event/useBreakpoint';
10 10
@@ -21,8 +21,7 @@ export function useECharts( @@ -21,8 +21,7 @@ export function useECharts(
21 const cacheOptions = ref<EChartsOption>({}); 21 const cacheOptions = ref<EChartsOption>({});
22 let removeResizeFn: Fn = () => {}; 22 let removeResizeFn: Fn = () => {};
23 23
24 - const [debounceResize] = useDebounce(resize, 200);  
25 - resizeFn = debounceResize; 24 + resizeFn = useDebounceFn(resize, 200);
26 25
27 const getOptions = computed( 26 const getOptions = computed(
28 (): EChartsOption => { 27 (): EChartsOption => {
src/hooks/web/useFullContent.ts
@@ -2,13 +2,14 @@ import { computed, unref } from &#39;vue&#39;; @@ -2,13 +2,14 @@ import { computed, unref } from &#39;vue&#39;;
2 2
3 import { useAppStore } from '/@/store/modules/app'; 3 import { useAppStore } from '/@/store/modules/app';
4 4
5 -import router from '/@/router'; 5 +import { useRouter } from 'vue-router';
6 6
7 /** 7 /**
8 * @description: Full screen display content 8 * @description: Full screen display content
9 */ 9 */
10 export const useFullContent = () => { 10 export const useFullContent = () => {
11 const appStore = useAppStore(); 11 const appStore = useAppStore();
  12 + const router = useRouter();
12 const { currentRoute } = router; 13 const { currentRoute } = router;
13 14
14 // Whether to display the content in full screen without displaying the menu 15 // Whether to display the content in full screen without displaying the menu
src/hooks/web/useLockPage.ts
1 import { computed, onUnmounted, unref, watchEffect } from 'vue'; 1 import { computed, onUnmounted, unref, watchEffect } from 'vue';
2 -import { useThrottle } from '/@/hooks/core/useThrottle'; 2 +import { useThrottleFn } from '@vueuse/core';
3 3
4 import { useAppStore } from '/@/store/modules/app'; 4 import { useAppStore } from '/@/store/modules/app';
5 import { useLockStore } from '/@/store/modules/lock'; 5 import { useLockStore } from '/@/store/modules/lock';
@@ -59,7 +59,7 @@ export function useLockPage() { @@ -59,7 +59,7 @@ export function useLockPage() {
59 clear(); 59 clear();
60 }); 60 });
61 61
62 - const [keyupFn] = useThrottle(resetCalcLockTimeout, 2000); 62 + const keyupFn = useThrottleFn(resetCalcLockTimeout, 2000);
63 63
64 return computed(() => { 64 return computed(() => {
65 if (unref(getLockTime)) { 65 if (unref(getLockTime)) {
src/hooks/web/usePermission.ts
@@ -94,6 +94,7 @@ export function usePermission() { @@ -94,6 +94,7 @@ export function usePermission() {
94 'Please switch PermissionModeEnum to ROLE mode in the configuration to operate!' 94 'Please switch PermissionModeEnum to ROLE mode in the configuration to operate!'
95 ); 95 );
96 } 96 }
  97 +
97 if (!isArray(roles)) { 98 if (!isArray(roles)) {
98 roles = [roles]; 99 roles = [roles];
99 } 100 }
src/layouts/default/menu/useLayoutMenu.ts
@@ -5,7 +5,7 @@ import { watch, unref, ref, computed } from &#39;vue&#39;; @@ -5,7 +5,7 @@ import { watch, unref, ref, computed } from &#39;vue&#39;;
5 import { useRouter } from 'vue-router'; 5 import { useRouter } from 'vue-router';
6 6
7 import { MenuSplitTyeEnum } from '/@/enums/menuEnum'; 7 import { MenuSplitTyeEnum } from '/@/enums/menuEnum';
8 -import { useThrottle } from '/@/hooks/core/useThrottle'; 8 +import { useThrottleFn } from '@vueuse/core';
9 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; 9 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
10 10
11 import { getChildrenMenus, getCurrentParentPath, getMenus, getShallowMenus } from '/@/router/menus'; 11 import { getChildrenMenus, getCurrentParentPath, getMenus, getShallowMenus } from '/@/router/menus';
@@ -20,7 +20,7 @@ export function useSplitMenu(splitType: Ref&lt;MenuSplitTyeEnum&gt;) { @@ -20,7 +20,7 @@ export function useSplitMenu(splitType: Ref&lt;MenuSplitTyeEnum&gt;) {
20 const permissionStore = usePermissionStore(); 20 const permissionStore = usePermissionStore();
21 const { setMenuSetting, getIsHorizontal, getSplit } = useMenuSetting(); 21 const { setMenuSetting, getIsHorizontal, getSplit } = useMenuSetting();
22 22
23 - const [throttleHandleSplitLeftMenu] = useThrottle(handleSplitLeftMenu, 50); 23 + const throttleHandleSplitLeftMenu = useThrottleFn(handleSplitLeftMenu, 50);
24 24
25 const splitNotLeft = computed( 25 const splitNotLeft = computed(
26 () => unref(splitType) !== MenuSplitTyeEnum.LEFT && !unref(getIsHorizontal) 26 () => unref(splitType) !== MenuSplitTyeEnum.LEFT && !unref(getIsHorizontal)
src/layouts/default/sider/useLayoutSider.ts
@@ -5,7 +5,7 @@ import { computed, unref, onMounted, nextTick, ref } from &#39;vue&#39;; @@ -5,7 +5,7 @@ import { computed, unref, onMounted, nextTick, ref } from &#39;vue&#39;;
5 import { TriggerEnum } from '/@/enums/menuEnum'; 5 import { TriggerEnum } from '/@/enums/menuEnum';
6 6
7 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; 7 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
8 -import { useDebounce } from '/@/hooks/core/useDebounce'; 8 +import { useDebounceFn } from '@vueuse/core';
9 9
10 /** 10 /**
11 * Handle related operations of menu events 11 * Handle related operations of menu events
@@ -64,7 +64,7 @@ export function useDragLine(siderRef: Ref&lt;any&gt;, dragBarRef: Ref&lt;any&gt;, mix = fals @@ -64,7 +64,7 @@ export function useDragLine(siderRef: Ref&lt;any&gt;, dragBarRef: Ref&lt;any&gt;, mix = fals
64 64
65 onMounted(() => { 65 onMounted(() => {
66 nextTick(() => { 66 nextTick(() => {
67 - const [exec] = useDebounce(changeWrapWidth, 80); 67 + const exec = useDebounceFn(changeWrapWidth, 80);
68 exec(); 68 exec();
69 }); 69 });
70 }); 70 });
src/views/sys/login/LoginForm.vue
@@ -88,8 +88,7 @@ @@ -88,8 +88,7 @@
88 import { useUserStore } from '/@/store/modules/user'; 88 import { useUserStore } from '/@/store/modules/user';
89 import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin'; 89 import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';
90 import { useDesign } from '/@/hooks/web/useDesign'; 90 import { useDesign } from '/@/hooks/web/useDesign';
91 - import { useKeyPress } from '/@/hooks/event/useKeyPress';  
92 - import { KeyCodeEnum } from '/@/enums/keyCodeEnum'; 91 + import { onKeyStroke } from '@vueuse/core';
93 92
94 export default defineComponent({ 93 export default defineComponent({
95 name: 'LoginForm', 94 name: 'LoginForm',
@@ -129,13 +128,8 @@ @@ -129,13 +128,8 @@
129 }); 128 });
130 129
131 const { validForm } = useFormValid(formRef); 130 const { validForm } = useFormValid(formRef);
132 - useKeyPress(['enter'], (events) => {  
133 - const keyCode = events.keyCode;  
134 131
135 - if (keyCode === KeyCodeEnum.ENTER) {  
136 - handleLogin();  
137 - }  
138 - }); 132 + onKeyStroke('Enter', handleLogin);
139 133
140 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN); 134 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN);
141 135