如何在Vue.js中延迟@keyup处理程序

vaqhlq81  于 2023-01-14  发布在  Vue.js
关注(0)|答案(2)|浏览(155)

我的看法:

ns-input#filterName(type="text", v-model="filterName", @keyup="searchTimeOut()")

在我vue代码中:

getUsers() {
   .
   .
   .
   API.users.index(params).then(blabla);
   .
   .
   .
},

searchTimeOut() {
  let timeout = null;
  clearTimeout(timeout);
  // Make a new timeout set to go off in 800ms
  timeout = setTimeout(() => {
    this.getUsers();
    console.log("hi")
  }, 800);
},

我只想在我停止打字和800毫秒后调用getUsers()一次。现在,我每次写信都调用getUsers()

bqjvbblv

bqjvbblv1#

在清除间隔之前删除this.timer值。请改为执行以下操作:

searchTimeOut() {  
    if (this.timer) {
        clearTimeout(this.timer);
        this.timer = null;
    }
    this.timer = setTimeout(() => {
        // your code
    }, 800);
}
2lpgd968

2lpgd9682#

有更好的解决办法!

去抖动是一种频繁限制调用耗时函数的技术,它将函数的执行延迟到指定时间,以避免不必要的CPU周期和API调用,并提高性能。

您可以访问此site,以获得此技术在JS中的可视化表示
要执行去抖:
1.在实用程序目录的helper.js中导出去抖动功能

// utilities/helper.js
export const debounce = (func, delay = 600, immediate = false) => {
  let timeout
  return function () {
    const context = this
    const args = arguments
    const later = function () {
      timeout = null
      if (!immediate) func.apply(context, args)
    }
    const callNow = immediate && !timeout
    clearTimeout(timeout)
    timeout = setTimeout(later, delay)
    if (callNow) func.apply(context, args)
  }
}

1.在你的组件中,你必须导入去抖动函数并将其赋值给变量。我将在mounted()中进行赋值。

<script>
import { debounce } from '~/utilities/helper'

export default {
  name: 'MyComponent',
  data() {
    return {
      debounceFn: null,
      filterName: ''
    }
  },
  mounted() {
    this.debounceFn = debounce(() => this.getUsers(), 800)
  },
  methods: {
    onKeyup() {
      this.debounceFn()
    },
    getUsers() {
      // Logic
    }
  }
}
</script>

1.现在将脚本连接到DOM

<template>
  <input type="text" v-model="filterName" @keyup="onKeyup" />
</template>

因此,通过执行上述步骤,getUsers()仅在您停止键入后调用一次,延迟为800毫秒。

相关问题