Vue.js页面中有多个input搜索框如何实现防抖操做(使用debounce的正确姿式)

出处:原文 由 熊孩子 于2019年10月23日发表在 Bloghome博客www.bloghome.com.cnjavascript

debounce简介

debounce是lodash工具库中的一个很是好用的函数。在实现搜索框对输入进行动态查询的时候,咱们须要防止前端频繁的发送查询请求给后端,这个时候就须要用到debounce,它能够设置一个时间间隔,好比300ms,忽略300毫秒内的输入变化。debounce的详细介绍能够参考这篇文章。html

debounce的高级用法

博主的页面中有3个搜索框,每一个搜索框都须要动态响应用户的输入到后台去查询匹配的文章,以下图:
multiple_search_box前端

在Vue.js中如何实现多搜索框的debounce绑定,下面博主就带你们一块儿来看一下:vue

1. 监听输入变量

上图,能够看到我有3个输入框,每一个输入框都须要设置一个变量来保存用户的输入:java

 

    data () {
      return {
        // 可用的文章列表
        columnItems: [],
        // 是否正在加载
        isLoading: [false, false, false],
        // 选择框搜索输入的值
        searchColumn1: '',
        searchColumn2: '',
        searchColumn3: ''
      }
    },

 

接下来,咱们把输入变量绑定到输入框上面。博主这里使用的是vuetify的combobox,若是使用html原生的input框或者其余框架的input元素,此处请稍做修改:es6

        <label>推荐专栏1</label>
        <v-combobox
          :items="columnItems"
          :loading="isLoading[0]"
          :search-input.sync="searchColumn1"
          ...
        >
        ...
        </v-combobox>
        <label>推荐专栏2</label>
        <v-combobox
          :items="columnItems"
          :loading="isLoading[1]"
          :search-input.sync="searchColumn2"
          ...
        >
        ...
        </v-combobox>
        <label>推荐专栏3</label>
        <v-combobox
          :items="columnItems"
          :loading="isLoading[2]"
          :search-input.sync="searchColumn3"
          ...
        >
        ...
        </v-combobox>

 

而后,我还须要监听这几个变量,若是发生改变则调用ajax进行后台查询:ajax

    watch: {
      searchColumn1 (val) {
        this.getColumns(val, 0)
      },
      searchColumn2 (val) {
        this.getColumns(val, 1)
      },
      searchColumn3 (val) {
        this.getColumns(val, 2)
      }
    },
    ...
    methods: {
      getColumns: function (searchValue, index) {
        // Items have already been requested
        if (this.isLoading[index]) return
        this.isLoading[index] = true

        let vm = this
        let options = {
          page: 1
        }

        if (searchValue) {
          options.title = searchValue.trim()
        } else {
          vm.columnItems = []
          vm.isLoading[index] = false
          return
        }

        // console.log(options)
        vm.$store.dispatch('getAllColumns', options).then(function (columns) {
          if (columns && columns.length) {
            vm.columnItems = columns
          }
          vm.isLoading[index] = false
        })
      }
    }

 

2. 添加debounce绑定

到目前为止,咱们都尚未添加debounce,上面的逻辑也彻底走的通,可是运行后你会发现输入操做运行的不流畅,若是打开dev-tools查看后台调用,你会发现用户输入后出发了一长串的ajax调用。所以咱们引入debounce。此处,咱们只需把含有ajax调用的函数提交给debounce,告诉它对getColumns()函数进行防抖操做。而在何处调用debounce则是很是有讲究的,错误的引入位置会使得debounce不起做用。请记住,debounce须要在created()钩子中引入。typescript

    import _ from 'lodash'
    ...
    created: function () {
      this.getColumns = _.debounce(this.getColumns, 500)
    },

 

最后,博主想抛出一个小问题:“为何必定要在created()钩子中调用debounce呢,mounted()或者其余的地方为何不能够呢?”,请知道的同窗留言或者发评论给我吧!
 编程

参考资料

 

更多精选文章

相关文章
相关标签/搜索