讲师中心 微信公众号
AI工具推荐 视频效率加速

Vue 3 中请求取消怎么在输入框防抖过程中取消未完成校验

夜伟小哥_7959

夜伟小哥_7959

发布时间:2026-10-06 06:40:20

|

333人浏览过

|

来源于php中文网

原创

Vue 3 中输入框防抖与请求取消需协同:防抖控制请求时机,AbortController或stale标记确保旧请求不干扰新结果;推荐封装useDebouncedFetch组合式函数。

vue 3 中请求取消怎么在输入框防抖过程中取消未完成校验

在 Vue 3 中,输入框防抖 + 请求取消,本质是两件事协同:一是控制请求发起时机(防抖),二是确保旧请求不干扰新结果(取消或忽略)。防抖本身不负责取消请求,它只延迟执行;真正要“取消未完成校验”,得靠 AbortController 或 手动标记+条件过滤。下面分场景讲清楚怎么做。

用 AbortController 主动中断上一个 fetch 请求

这是最干净、资源最省的方式,尤其适合原生 fetch。核心是在每次新请求前 abort 上一个 controller:

  • 声明一个响应式 ref 存 controller 实例:const controller = ref(null)
  • 每次触发防抖回调时,先调 controller.value?.abort(),再新建 controller 并传给 fetch 的 signal
  • 注意捕获 AbortError,避免报错中断流程

示例代码:

<script setup>
import { ref, watch } from 'vue'
const keyword = ref('')
const list = ref([])
const controller = ref(null)

// 防抖逻辑(手动实现)
let timeout = null
watch(keyword, (val) => {
clearTimeout(timeout)
if (!val.trim()) return
timeout = setTimeout(async () => {
// 取消上一次请求
controller.value?.abort()
controller.value = new AbortController()
try {
const res = await fetch(`/api/search?q=${encodeURIComponent(val)}`, {
signal: controller.value.signal
})
const data = await res.json()
list.value = data.items
} catch (err) {
if (err.name !== 'AbortError') {
console.error('请求失败:', err)
}
// 忽略被中止的错误
}
}, 300)
})
</script>

用 onCleanup + stale 标记忽略过期响应

适用于无法使用 AbortController 的场景(比如某些封装的请求库不支持 signal),或者你用的是 watchEffect。原理是:每次 watch 触发时注册清理函数,把当前请求标记为“已过期”,等响应回来时判断是否 still valid:

立即学习“前端免费学习笔记(深入)”;

vue-component-analyzer
vue-component-analyzer

递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。

下载
  • 在 watch 回调里定义 let stale = false
  • 用 onCleanup(() => { stale = true }) 确保上一次请求被标记
  • 响应返回后只更新 if (!stale) 的那次

这种方式不真正中断网络请求,但能保证 UI 不被错乱数据覆盖。

封装成可复用的组合式函数(推荐)

把防抖 + AbortController 封装成 useDebouncedFetch,以后直接调用,避免重复写逻辑:

  • 接收搜索关键词 ref、请求 URL 模板、延迟毫秒数
  • 内部管理 controller、timeout、loading、data、error 等状态
  • 暴露 execute 方法,也可支持手动取消(cancel())

这样在组件里就只需:

const { data, loading, execute } = useDebouncedFetch(
keyword,
(q) => `/api/search?q=${encodeURIComponent(q)}`,
300
)
watch(keyword, () => execute())

不建议混用 lodash.debounce + 手动 cancel 的原因

虽然 lodash.debounce 提供 .cancel() 方法,但它只能取消“还没执行的定时器”,对已经发出的请求完全无感。也就是说:

  • 用户输 “vue” → debounce 定时器设为 300ms 后发请求
  • 又快速输 “vue3” → 前一个定时器被 cancel,但“vue”的请求如果已发出,仍会回来并可能覆盖结果

所以仅靠 debounce 不能解决竞态问题,必须配合请求层的取消机制(AbortController)或响应层的 stale 判断。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2560

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2393

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1141

2024.09.24

vue2.0和3.0区别
vue2.0和3.0区别

vue2.0和3.0区别:vue2的响应式原理是利⽤“Object.defineProperty()”对数据进⾏劫持结合发布订阅模式的⽅式来实现,vue3中使⽤了es6的proxy API对数据代理,实现对数据的监控。本专题为大家提供vue2.0和3.0区别的相关的文章、下载、课程内容,供大家免费下载体验。

1634

2023.07.17

vue3的生命周期有哪些
vue3的生命周期有哪些

vue3的生命周期:1、beforecreate;2、created;3、beforemount;4、mounted;5、beforeupdate;6、updated;7、beforedestroy;8、destroyed;9、activated;10、deactivated等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

11862

2024.02.23

Vue3组合式API与组件开发实战
Vue3组合式API与组件开发实战

本专题讲解 Vue 3 组合式 API 的核心概念与应用技巧,深入分析响应式系统、生命周期管理、组件设计与复用策略。通过完整项目案例,指导前端开发者实现高性能、结构清晰的 Vue 应用,提升开发效率与代码可维护性。

296

2026.02.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 16.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn