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

夜伟小哥_7959

夜伟小哥_7959

2026-10-06

333人浏览

原创

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><br> import { ref, watch } from '<a style="color:#f60; text-decoration:underline;" title= "vue"href="https://m.php.cn/zt/15721.html" target="_blank">vue'<br> const keyword = ref('')<br> const list = ref([])<br> const controller = ref(null)<br> <br> // 防抖逻辑(手动实现)<br> let timeout = null<br> watch(keyword, (val) => {<br> clearTimeout(timeout)<br> if (!val.trim()) return<br> timeout = setTimeout(async () => {<br> // 取消上一次请求<br> controller.value?.abort()<br> controller.value = new AbortController()<br> try {<br> const res = await fetch(`/api/search?q=${encodeURIComponent(val)}`, {<br> signal: controller.value.signal<br> })<br> const data = await res.json()<br> list.value = data.items<br> } catch (err) {<br> if (err.name !== 'AbortError') {<br> console.error('请求失败:', err)<br> }<br> // 忽略被中止的错误<br> }<br> }, 300)<br> })<br> </script>

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

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

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

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

vue-component-analyzer
vue-component-analyzer

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

下载

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

把防抖 + 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 判断。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

vue.js vue vue 3

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
ajax教程
ajax教程

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

2023.06.14

2560

4

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

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

2023.08.31

340

5

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

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

2023.11.15

2393

5

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

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

2024.09.24

1141

6

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

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

2023.07.17

1634

5

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

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

2024.02.23

11862

5

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

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

2026.02.10

296

23

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

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

2026.09.30

80

10

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

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

2026.09.30

80

14

热门下载

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

精品课程

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

共42课时 | 16.9万人学习

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

共12课时 | 1.4万人学习

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

共18课时 | 1.7万人学习