多次点击只请求一次

本文探讨了在前端开发中遇到的问题,即在快速点击按钮导致多次请求同一数据的问题。通过介绍两种解决方案,一是使用Vue的`this.$nextTick()`配合标志变量避免多次请求,二是应用防抖(debounce)函数来确保在特定时间内只执行一次请求。这两种方法都是为了优化用户体验,防止列表数据异常。
部署运行你感兴趣的模型镜像

问题:在弹窗中有个按钮,点击上线,会在列表中添加一条数据,然后弹窗消失。现在在点击按钮时,由于点击过快,在点击上线按钮到弹窗消失期间,导致请求了多次数据,造成了在列表多出了几次同一时间的信息。希望在上线按钮到弹窗消失期间,只请求一次。

解决方法一:使用this.$nextTick(),nextTick(),是将回调函数延迟在下一次dom更新数据后调用,简单的理解是:当数据更新了,在dom中渲染后,自动执行该函数。其实定时器也能完成需求。

在弹窗组件中的data定义一个flag,表示请求状态

data() {
      return {
        //flag 是可以发起上线请求
        flag: true,
      }
    },
  
 if(this.flag) {    //第一次flag为true 直接请求  
              this.flag = false   //请求结束后,将flag变为false,让他无法请求
              return createNotes(param).then(data => { //拿列表数据
                this.$nextTick(() => {   //利用nextTick 表示,在列表拿到数据重新渲染后才会将flag变为true,才会再次请求
                  this.flag = true    //true 可以开启下次请求
                })
                
            }

解决方法二:多次请求并为一次请求,可以利用防抖的思想,防抖的思想是:一定时间连续触发的事件,只在最后执行一次

//防抖函数
debounce(func, wait, immediate) {
  let timeout
  
  return function(...args) {
    let context = this
    if (timeout) clearTimeout(timeout)

    if (immediate) {
      let callNow = !timeout
      timeout = setTimeout(function() {
        timeout = null
      }, wait)
      if (callNow) func.apply(context, args)
    } else {
      timeout = setTimeout(function() {
        func.apply(context, args)
      }, wait)
    }
  }
}
<div @click="clickE(vm)"></div>
methods: {
clickE: debounce((vm) => {
 // 点击事件后做的事
}, 1000, true)
}

您可能感兴趣的与本文相关的镜像

Linly-Talker

Linly-Talker

AI应用

Linly-Talker是一款创新的数字人对话系统,它融合了最新的人工智能技术,包括大型语言模型(LLM)、自动语音识别(ASR)、文本到语音转换(TTS)和语音克隆技术

在使用 `el-upload` 组件进行多文件上传时,如果希望确保多次请求只执行最后一次,可以通过自定义上传方法并结合防抖机制来实现。由于 `el-upload` 默认会对每个文件发起独立的上传请求,因此需要禁用默认上传行为,并通过自定义请求将多个文件一次性上传到服务器。 在配置中,设置 `auto-upload="false"` 可以阻止组件在选择文件后立即上传,而是等待手动调用 `submit` 方法。同时,通过 `http-request` 属性指定自定义的上传函数,该函数可以处理多个文件的上传逻辑。在该函数中,可以使用防抖机制确保只有最后一次请求被执行,避免重复提交。 ### 示例代码 ```html <template> <el-upload ref="upload" action="" :auto-upload="false" :http-request="customUpload" multiple :file-list="fileList" > <el-button slot="trigger" type="primary">选取文件</el-button> <el-button @click="submitUpload">上传到服务器</el-button> </el-upload> </template> <script> export default { data() { return { fileList: [], timer: null }; }, methods: { submitUpload() { this.$refs.upload.submit(); }, customUpload({ file, onSuccess, onError }) { // 使用防抖机制,确保只执行最后一次请求 if (this.timer) { clearTimeout(this.timer); } this.timer = setTimeout(() => { // 模拟上传逻辑 try { // 这里可以替换为实际的上传逻辑 console.log('正在上传文件:', file.name); onSuccess(); // 模拟上传成功 } catch (error) { onError(); // 模拟上传失败 } }, 300); } } }; </script> ``` ### 实现原理 1. **禁用自动上传**:通过 `auto-upload="false"` 阻止组件在选择文件后立即上传。 2. **自定义上传函数**:通过 `http-request` 指定自定义上传函数 `customUpload`,该函数负责处理上传逻辑。 3. **防抖机制**:在 `customUpload` 函数中使用 `setTimeout` 和 `clearTimeout` 实现防抖逻辑,确保只有最后一次上传请求会被执行。 4. **手动提交上传**:通过 `submitUpload` 方法调用 `el-upload` 的 `submit` 方法,触发所有文件的上传流程。 该方法适用于需要避免重复请求的场景,例如在用户多次点击上传按钮时,只执行最后一次上传操作,从而提高上传效率并避免资源浪费。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值