vue自定义指令,包装函数节流。

自定义指令的钩子函数

Vue 提供了自定义指令的5个钩子函数:

  • bind:指令第一次绑定到元素时调用,只执行一次。在这里可以进行一次性的初始化设置。
  • inserted:被绑定的元素,插入到父节点DOM时被调用。
  • update:绑定元素更新时调用。
  • componentUpdated:绑定元素与子元素更新时调用。
  • unbing:只调用一次,指令与元素解绑时调用。

钩子函数的参数 (即 el、binding、vnodeoldVnode)。

  • el:指令所绑定的元素,可以用来直接操作 DOM。
  • binding:一个对象,包含以下 property:
    name:指令名,不包括 v- 前缀。
    value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
    oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
    arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
    modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。

项目中 el + binding.value 就够用了,比如网上搜的一个例子,函数节流指令:

<template>
 <div>
  <el-input
   type="text"
   v-model="text"
   v-debounce="search" showClear
  >
  </el-input>
 </div>
</template>
<script>
 export default {
  name: 'debounce',
  data () {
   return {
    text: '',
    count: 1
   }
  },
  directives: {
   debounce: {
    inserted: function (el, binding) {
       let input =  el.querySelector('input')
     let timer
     input.addEventListener('keyup', () => {
      if (timer) {
       clearTimeout(timer)
      }
      timer = setTimeout(() => {
       binding.value()
      }, 300)
     })
    }
   }
  },
  methods: {
   search () {
   // 实际要进行的操作 axios.get('')之类的
    this.count++
    console.log('count is:' + this.count)
   }
  }
 }
</script>

本来那个input 是原生元素,想试试组件el-input支持不 结果还真支持,所以看了下组件源码,结果这里的el只是input的父元素div!!!el-input没有做任何操作,而且支监听div的keyup起到节流效果,没有任何问题??? 一脸黑人问号。。。求大神解释

为了安全起见 还是绑定给input了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容