草庐IT

vue自定义指令监听input输入,当输入完成才能调取接口,防止频繁调用接口

Meta.Qing 2023-04-08 原文

Vue 自定义指令来实现监听 input 输入,但是你需要配合一些 JavaScript 代码才能实现输入完成后才调用接口的逻辑。

下面是一个简单的实现示例:

<template>
  <div>
    <input v-model="inputValue" v-debounce-input:500ms="getData" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputValue: '',
      timer: null
    }
  },
  methods: {
    getData() {
      // 在这里编写调用接口的代码
      console.log('调用接口', this.inputValue)
    }
  },
  directives: {
    'debounce-input': {
      inserted(el, binding) {
        let timeout
        el.addEventListener('input', () => {
          clearTimeout(timeout)
          timeout = setTimeout(() => {
            binding.value()
          }, parseInt(binding.arg) || 300)
        })
      }
    }
  }
}
</script>

在上面的示例中,我们定义了一个自定义指令叫做 v-debounce-input。该指令监听了 input 事件,并使用 setTimeout 实现了防抖的逻辑,从而在用户输入完成之后才会调用 getData 方法。同时,我们还在指令的参数中使用了 500ms,表示用户输入完成后需要等待 500 毫秒才会调用 getData 方法,从而避免了频繁调用接口的问题。

需要注意的是,上面的代码中使用了一个 timer 变量来记录定时器的 ID,从而可以在用户输入新的内容时清除旧的定时器,避免出现多个定时器同时执行的情况。

总结一下,自定义指令可以用来监听 input 输入,并使用防抖的方式来实现在用户输入完成后才调用接口的逻辑。这样就可以避免频繁调用接口的问题,提高应用的性能和用户体验。

clearTimeout(timeout) 的作用是清除一个之前通过 setTimeout 创建的定时器,如果定时器已经被触发,则此方法将不起作用。

在上述示例中,clearTimeout(timeout) 的作用是清除上一次输入事件触发的定时器,这样可以避免在用户输入新的内容时,上一次的定时器依然在计时,导致多次调用 getData 方法。

由于 clearTimeout 方法不会影响下一行代码的执行,因此在这个示例中,clearTimeout(timeout)timeout = setTimeout(() => {binding.value()}, parseInt(binding.arg) || 300) 可以被认为是独立的两个操作,它们之间没有任何影响。具体来说,当用户输入新的内容时,clearTimeout(timeout) 会立即清除上一次触发的定时器,而 timeout = setTimeout(() => {binding.value()}, parseInt(binding.arg) || 300) 则会创建一个新的定时器,等待指定的时间后再执行 binding.value() 方法。

需要注意的是,由于 JavaScript 是单线程执行的,因此定时器的回调函数执行时会阻塞主线程,如果回调函数执行时间过长,会影响用户体验。因此,一般来说应该尽可能缩短定时器的等待时间,避免出现长时间的阻塞。

在 Vue.js 中,指令(Directive)是一种带有 v- 前缀的特殊属性。指令用于在模板中添加特殊行为,例如控制元素的显示和隐藏、监听事件、绑定属性等。

其中,inserted 方法是指令钩子函数之一,它会在被绑定的元素插入到父元素中时调用。inserted 方法的定义如下:

inserted(el, binding, vnode, oldVnode) {
  // ... 
}

inserted 方法接收四个参数:

  • el:指令绑定的元素。

  • binding:一个对象,包含指令的信息。可以访问指令的值、参数、修饰符等。

  • vnode:Vue 编译生成的虚拟节点。

  • oldVnode:上一个虚拟节点,仅在 componentUpdatedupdate 钩子中可用。

inserted 方法通常用于在元素被插入到 DOM 中后,对元素进行一些操作,例如聚焦元素、设置样式、进行初始化等。

需要注意的是,如果指令所绑定的元素是动态生成的,例如通过 v-if、v-for 等指令动态生成的元素,那么 inserted 方法将在元素被添加到 DOM 中后才会调用。

binding对象怎么用?

在 Vue.js 中,指令钩子函数的第二个参数是一个对象,用于获取指令的相关信息。这个对象被称为 binding 对象。

binding 对象包含以下属性:

  • name:指令名称,不包括 v- 前缀。

  • value:指令的绑定值。

  • oldValue:指令的前一个绑定值,仅在 updatecomponentUpdated 钩子中可用。

  • expression:指令的绑定表达式。

  • arg:指令的参数,没有参数则为 null

  • modifiers:一个对象,包含指令的修饰符。

可以通过 binding.value 获取指令的绑定值,例如:

Vue.directive('my-directive', {
  inserted(el, binding) {
    console.log(binding.value) // 输出指令的绑定值
  }
})

指令的绑定值可以是一个字符串、一个对象、一个数组、一个函数等任何类型的值。在实际使用中,可以根据不同的指令需求,使用不同类型的绑定值,并在钩子函数中根据绑定值来进行相关操作。

除了 binding.value,还可以通过 binding.arg 获取指令的参数,通过 binding.modifiers 获取指令的修饰符。例如:

Vue.directive('my-directive', {
  inserted(el, binding) {
    console.log(binding.arg) // 输出指令的参数
    console.log(binding.modifiers) // 输出指令的修饰符
  }
})

需要注意的是,如果指令没有参数和修饰符,那么 binding.argbinding.modifiers 将分别为 null{}

有关vue自定义指令监听input输入,当输入完成才能调取接口,防止频繁调用接口的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  3. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  4. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  10. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

随机推荐