前端学习

项目经验 | Vue搜索框 + debounce防抖

2019-06-28  本文已影响0人  格致匠心
<el-input v-model="keywords"/>
import { $public, $formTools } from '@/helper'
export default {
  data() {
    return {
      keywords: ''
    }
  },
  watch: {
    keywords () {
      this.debouncedSearch()
    }
  },
  created () {
    this.debouncedSearch = $public._debounce(this.fetchPage)
  },
  methods: {
    fetchPage (page = 1) {
      let optionsObj = { limit: 10, offset: (page - 1) * 10 }
      if (this.keywords.length > 0) optionsObj['search'] = this.keywords
      let options = this.$formTools.getOptions('get', optionsObj)
      this.$apis.manageGetProblemList(options).then(res => {
        this.result = res.result
      })
    }
  }
}

小项目不想引入lodash,所以是手写的debounce和throttle

export default {
  _debounce (fn, delay) {
    delay = delay || 600
    let timer
    return function () {
      let ctx = this
      let args = arguments
      if (timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(() => {
        timer = null
        fn.apply(ctx, args)
      }, delay)
    }
  },
  _throttle (fn, interval) {
    let last
    let timer
    interval = interval || 600
    return function () {
      let ctx = this
      let args = arguments
      let now = new Date()
      if (last && now - last < interval) {
        clearTimeout(timer)
        timer = setTimeout(function () {
          last = now
          fn.apply(ctx, args)
        }, interval)
      } else {
        last = now
        fn.apply(ctx, args)
      }
    }
  }
}
上一篇下一篇

猜你喜欢

热点阅读