吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 772|回复: 7
收起左侧

[求助] vue3,如何利用customRef 实现函数执行防抖

[复制链接]
cqwcns 发表于 2023-1-21 22:22
本帖最后由 cqwcns 于 2023-1-21 22:28 编辑

我希望点击按钮触发myFun函数,但如果2秒内多次点击,最终只会执行一次myFun。
我留意到vue3有个customRef 方法是实现input防抖的,有没有办法改一下,实现函数执行防抖,请各位大佬指教,感谢。


[JavaScript] 纯文本查看 复制代码
<template>

  <button @click="toAction">触发</button>

</template>

<script setup>
import { customRef } from 'vue'

function useDebouncedRef(value, delay = 200) {
  let timeout
  return customRef((track, trigger) => {
    return {
      get() {
        track()
        return value
      },
      set(newValue) {
        clearTimeout(timeout)
        timeout = setTimeout(() => {
          value = newValue
          trigger()
        }, delay)
      }
    }
  })
}

const myFun = () => {
  console.log('函数执行了')
}

const toAction = () => {
  console.log('触发了');
  useDebouncedRef(myFun, 2000)
}

</script>


使用场景说明:

正常来说,防抖主要是用于input的输入。函数执行完全加一些逻辑来实现防抖。
但实际使用的场景是element-plus select-v2组件(远程搜索),它有个input动态生成的,无法使用一般的input防抖。
所以考虑从在远程搜索函数上进行防抖。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Goldrepo 发表于 2023-1-22 00:00
github上面没有相关案例可以参考吗?
Qin77 发表于 2023-1-22 00:02
steven026 发表于 2023-1-22 00:14
[JavaScript] 纯文本查看 复制代码
let lastClick=0
const toAction = () => {
  console.log('触发了');
  const now=Date.now();
  if(now - lastClick < 2000) return //防抖 本次点击-上次点击<2000
  lastClick=now;
  useDebouncedRef(myFun, 2000)
}

自己实现一个就行了,就几行,利用Date.now()对比2次点击时间差

免费评分

参与人数 1吾爱币 +1 收起 理由
cqwcns + 1 谢谢@Thanks!

查看全部评分

啊笨 发表于 2023-1-22 10:31
高手,学习了!
索马里的海贼 发表于 2023-1-22 10:51
用rxjs吧,一把梭~

免费评分

参与人数 1吾爱币 +1 收起 理由
cqwcns + 1 谢谢@Thanks!

查看全部评分

头像被屏蔽
我去年买了各表 发表于 2023-1-22 18:49
提示: 作者被禁止或删除 内容自动屏蔽
iLouis 发表于 2023-1-27 18:59
一般来说,防抖都是自己写,没几句的事情。

[JavaScript] 纯文本查看 复制代码
// 防抖对象
function debounce(fnRun, interval, fnRe) {
    let timer = 0;
    return (...args) => {
        let realInterval = new Date() - timer
        // 这里也可以把间隔传回去,比如要搞个提示之类的
        if (realInterval < interval) return fnRe ? fnRe.apply(null, args) : false 
        timer = +new Date();
        // 这里也可以把当前时间戳传回去,比如要发给服务器
        fnRun.apply(null, args)
    }
}

// 测试绑定
let myOnChange = new debounce(
    inputText => console.log(`run: ${inputText}`),
    2000,
    inputText => console.log(`return: ${inputText}`)
)

// 测试输入
setInterval(() => {
    myOnChange('inputText')
}, 500)


当然也可以根据es5、es6、ts规则改成class之类的。
也可以把返回函数改成promise之类的

如果不是很需要这个,直接外面一个全局new Date,里面一个new Date,<间隔直接return,也是可以的。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-17 00:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表