Merge branch 'main' of github.com:xiaoxian521/vue-pure-admin

This commit is contained in:
xiaoxian521 2022-04-19 11:42:54 +08:00
commit 14619588d4
7 changed files with 101 additions and 15 deletions

View File

@ -74,5 +74,6 @@ menus:
hsAntTabs: Imitate Antdv Tabs hsAntTabs: Imitate Antdv Tabs
hsAntAnchor: Imitate Antdv Anchor hsAntAnchor: Imitate Antdv Anchor
hsAntTreeSelect: Imitate Antdv TreeSelector hsAntTreeSelect: Imitate Antdv TreeSelector
list: List Page hsList: List Page
listCard: Card List Page hsListCard: Card List Page
hsDebounce: Debounce & Throttle

View File

@ -74,5 +74,6 @@ menus:
hsAntTabs: 仿antdv标签页 hsAntTabs: 仿antdv标签页
hsAntAnchor: 仿antdv锚点 hsAntAnchor: 仿antdv锚点
hsAntTreeSelect: 仿antdv树型选择器 hsAntTreeSelect: 仿antdv树型选择器
list: 列表页 hsList: 列表页
listCard: 卡片列表页 hsListCard: 卡片列表页
hsDebounce: 防抖节流

View File

@ -92,6 +92,15 @@ const ableRouter = {
title: $t("menus.hsAntTreeSelect"), title: $t("menus.hsAntTreeSelect"),
i18n: true i18n: true
} }
},
{
path: "/able/debounce",
name: "reDebounce",
component: () => import("/@/views/able/debounce.vue"),
meta: {
title: $t("menus.hsDebounce"),
i18n: true
}
} }
] ]
}; };

View File

@ -7,7 +7,7 @@ const ableRouter = {
redirect: "/list/card", redirect: "/list/card",
meta: { meta: {
icon: "list-check", icon: "list-check",
title: $t("menus.list"), title: $t("menus.hsList"),
i18n: true, i18n: true,
rank: 12 rank: 12
}, },
@ -18,7 +18,7 @@ const ableRouter = {
component: () => import("/@/views/list/card/index.vue"), component: () => import("/@/views/list/card/index.vue"),
meta: { meta: {
icon: "card", icon: "card",
title: $t("menus.listCard"), title: $t("menus.hsListCard"),
i18n: true, i18n: true,
showParent: true showParent: true
} }

View File

@ -1,12 +1,39 @@
import { unref } from "vue";
import type { Ref } from "vue";
type FunctionArgs<Args extends any[] = any[], Return = void> = (
...args: Args
) => Return;
type MaybeRef<T> = T | Ref<T>;
// 延迟函数 // 延迟函数
export const delay = (timeout: number) => export const delay = (timeout: number) =>
new Promise(resolve => setTimeout(resolve, timeout)); new Promise(resolve => setTimeout(resolve, timeout));
// 防抖函数 /**
export const debounce = (fn: () => Fn, timeout: number) => { *
* @param fn
* @param timeout
* @param immediate
* @returns
*/
export const debounce = <T extends FunctionArgs>(
fn: T,
timeout: MaybeRef<number> = 200,
immediate = false
) => {
let timmer: TimeoutHandle; let timmer: TimeoutHandle;
const wait = unref(timeout);
return () => { return () => {
timmer ? clearTimeout(timmer) : null; timmer && clearTimeout(timmer);
timmer = setTimeout(fn, timeout); if (immediate) {
if (!timmer) {
fn();
}
timmer = setTimeout(() => (timmer = null), wait);
} else {
timmer = setTimeout(fn, wait);
}
}; };
}; };

View File

@ -0,0 +1,52 @@
<script setup lang="ts">
import { ElMessage } from "element-plus";
import { debounce } from "/@/utils/debounce";
import { useDebounceFn, useThrottleFn } from "@vueuse/core";
const handle = () => {
ElMessage({
message: "恭喜你,这是一条成功消息",
type: "success"
});
};
const immediateDebounce = debounce(handle, 1000, true);
const debounceClick = useDebounceFn(handle, 1000);
const throttleClick = useThrottleFn(handle, 1000, false);
</script>
<template>
<div>
<el-card class="mb-5">
<template #header>
<div>防抖debounce</div>
</template>
<div class="mb-5">
所谓防抖就是指触发事件后在 n 秒内函数只能执行一次如果在 n
秒内又触发了事件则会重新计算函数执行时间
</div>
<el-button @click="immediateDebounce"
>连续点击我只会执行最后一次点击事件立即执行</el-button
>
<el-button @click="debounceClick"
>连续点击我只会执行最后一次点击事件延后执行</el-button
>
</el-card>
<el-card>
<template #header>
<div>节流throttle</div>
</template>
<div class="mb-5">
所谓节流就是指连续触发事件但是在 n
秒中只执行一次函数节流会稀释函数的执行频率
</div>
<el-button @click="throttleClick"
>连续点击我每一秒只会执行一次点击事件</el-button
>
</el-card>
</div>
</template>
<style scoped></style>

View File

@ -55,11 +55,7 @@ function onCloseTags() {
<template> <template>
<el-card> <el-card>
<template #header> <template #header>
<div class="card-header"> <div>标签页复用超出限制自动关闭使用场景: 动态路由</div>
<span class="font-medium"
>标签页复用超出限制自动关闭使用场景: 动态路由</span
>
</div>
</template> </template>
<el-button v-for="index in 6" :key="index" @click="toDetail(index)"> <el-button v-for="index in 6" :key="index" @click="toDetail(index)">
打开{{ index }}详情页 打开{{ index }}详情页