news 2026/9/13 10:58:32

第三十七节:防抖、节流封装(composables 通用函数,搜索框防重复请求)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第三十七节:防抖、节流封装(composables 通用函数,搜索框防重复请求)

第三十七节:防抖、节流封装(composables 通用函数,搜索框防重复请求)

🎯本节目标

  1. 区分防抖 debounce节流 throttle
    • 防抖:输入框搜索,停止输入后延迟执行(适合搜索输入)
    • 节流:滚动、窗口缩放,固定间隔执行(适合滚动、按钮频繁点击)
  2. 封装成composables组合式函数,项目全局复用
  3. 用户管理页面搜索框接入防抖,防止连续输入疯狂发请求

原理简述

  • 防抖:每次触发就重置计时器,最后一次操作后等待 delay 才执行
  • 节流:规定时间内,最多只执行一次

步骤 1:新建文件src/composables/useDebounceThrottle.js

import { ref } from 'vue' // 防抖 export function useDebounce(fn, delay = 500) { const timer = ref(null) const debounceFn = (...args) => { // 每次触发清除旧定时器 if (timer.value) clearTimeout(timer.value) timer.value = setTimeout(() => { fn(...args) }, delay) } // 手动取消防抖 const cancel = () => { if (timer.value) { clearTimeout(timer.value) timer.value = null } } return { debounceFn, cancel } } // 节流 export function useThrottle(fn, delay = 500) { const lastTime = ref(0) const throttleFn = (...args) => { const now = Date.now() if (now - lastTime.value >= delay) { lastTime.value = now fn(...args) } } return { throttleFn } }

步骤 2:用户列表页面接入防抖(src/views/system/user/user.vue)

原来的搜索是输入框 change 或者点击查询,现在输入框实时搜索用防抖

<template> <PageCard title="用户管理"> <el-form :model="queryParams" inline> <el-form-item label="用户名"> <!-- 绑定防抖后的查询方法 --> <el-input v-model="queryParams.username" placeholder="请输入用户名" clearable @input="handleSearch" /> </el-form-item> <el-form-item> <el-button type="primary" @click="getList">查询</el-button> <el-button @click="resetQuery">重置</el-button> </el-form-item> </el-form> <!-- 表格省略 --> </PageCard> </template> <script setup> import { ref, reactive, onUnmounted } from 'vue' // 引入防抖 import { useDebounce } from '@/composables/useDebounceThrottle' import { getUserListApi } from '@/api/system/user' defineOptions({ name: 'UserList' }) const queryParams = reactive({ username: '', pageNum: 1, pageSize: 10 }) const tableData = ref([]) const total = ref(0) // 获取列表 const getList = async () => { const res = await getUserListApi(queryParams) if(res.code ===200){ tableData.value = res.data.records total.value = res.data.total } } // ✅ 包装防抖,500毫秒延迟 const { debounceFn: handleSearch, cancel } = useDebounce(getList, 500) // 组件销毁,清除定时器,防止内存泄漏 onUnmounted(()=>{ cancel() }) // 重置 const resetQuery = () => { queryParams.username = '' queryParams.pageNum = 1 getList() } getList() </script>

步骤 3:按钮频繁点击场景(节流示例,防止重复提交)

import { useThrottle } from '@/composables/useDebounceThrottle' // 提交按钮,1s内只能点击一次 const submitForm = async () => { console.log('提交表单') } const { throttleFn: handleSubmit } = useThrottle(submitForm,1000)

模板:

<el-button type="primary" @click="handleSubmit">提交</el-button>

✅ 测试清单

  1. 保存重启项目pnpm dev,进入用户管理
  2. 在用户名输入框快速连续打字
    ✅ 不会每次打字立刻发接口,停止输入半秒后才请求一次
  3. 快速重复点击提交按钮(节流案例),1 秒内只执行一次

常见坑

  1. composables 函数只能在 setup 顶层调用,不能写在 if / 循环里面
  2. 组件销毁一定要清除定时器,避免内存泄漏
  3. delay 单位是毫秒,搜索一般 300~500,按钮节流推荐 1000
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 10:57:18

Temu跨境电商创业指南:选品策略与运营技巧

1. 项目概述&#xff1a;Temu跨境电商的机遇与挑战 2026年的跨境电商市场正在经历前所未有的变革。作为新兴电商平台的代表&#xff0c;Temu凭借其独特的商业模式和供应链优势&#xff0c;正在为全球创业者创造大量机会。这个平台特别适合希望在家创业的个人和小型团队&#xf…

作者头像 李华
网站建设 2026/9/13 10:55:43

从短期到长期:Agent记忆系统设计与工程落地指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 10:53:59

HiTool 5.3.16 TFTP固件烧录与现场交付实践指南

简介&#xff1a;HiTool5.3.16是一款面向IT运维工程师、嵌入式开发人员及系统管理员的综合性诊断与管理工具套件&#xff0c;聚焦网络排查、设备烧录、日志分析、远程管控与芯片级调试等高频技术场景。资源包为官方完整版ZIP压缩包&#xff0c;共1254个文件&#xff0c;体量达1…

作者头像 李华
网站建设 2026/9/13 10:53:53

SCons入门:从安装到构建C++项目,告别scons未找到命令

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 10:53:50

提示词工程实操指南:10个技巧与模板库,今天就能上手

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华