javascript - 避免每次输入字母时更新 Vue.js 搜索

标签 javascript search vue.js

我在我的 web 应用程序中使用 vue.js 2.0 构建了一个搜索组件。我现在遇到的问题是它搜索每种类型的事件。假设我想搜索 samsung。它向我的服务器发出 7 个请求(7 个字母)。

我的输入字段如下所示:

<input
        class="input pr-4 pl-10 block"
        type="text"
        placeholder="Search for anything..."
        v-model="search"
        @keydown.enter="isOpen = false"
        @keydown.esc="isOpen = false"
        @input="onChange"/>

如何确保它仅在键入单词时进行搜索(以便它向我的服务器发出 1 个请求)

最佳答案

通常,您可以通过引入一定程度的延迟或所谓的去抖来解决此类问题。通过对函数进行去抖,您基本上是说“在这么多毫秒后执行此函数,除非再次调用去抖函数”。如果用户输入的速度足够快,就会节省一些对服务器的请求。延迟应该足够小,以免用户察觉,但也应该足够大,以防止向服务器发送不必要的垃圾邮件。在此示例中,我使用 lodash 的去抖函数 ( documentation )。

如果您的搜索总体上花费的时间太长,去抖将有助于减少出血,但不会阻止它。考虑添加一个实际的搜索按钮,并在单击该按钮和/或按 Enter 键时触发搜索。您还可以创建一个低成本的“建议”搜索和一个搜索所有内容的常规搜索,类似于您在维基百科等搜索框中键入内容时看到的内容。

<template>
  <input
    class="input pr-4 pl-10 block"
    type="text"
    placeholder="Search for anything..."
    v-model="search"
    @keydown.enter="isOpen = false"
    @keydown.esc="isOpen = false"
    @input="debouncedOnChange"
  />
</template>

<script>
import _debounce from 'lodash.debounce';

export default {
  name: 'search',
  data () {
    return {
      search: '',
      isOpen: false
    }
  },

  computed: {
    debouncedOnChange () {
      return _debounce(this.onChange, 700);
    }
  },

  methods: {
    onChange () {
      // do something with this.search
    }
  }
}
</script>

Edit Vue Template

关于javascript - 避免每次输入字母时更新 Vue.js 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52677965/

相关文章:

javascript - 在 html 中突出显示下拉表单选项的当前选定选项

javascript - vue-cli-service使用的入口文件是哪个?

javascript - 从文本区域获取更新值并使用 jQuery 将其插入到 div 中?

javascript - 删除重复的对象

c - 哈希表搜索和移动过去已删除的项目

javascript - 在 Javascript 中搜索号码

javascript - 使用 ajax 在 Vue.js 中提交表单

vue.js - 如何在echarts baidu中获取dataZoom changed事件中start和end的值?

javascript - 检测 Scroll 何时到达页面的底部 [没有 jQuery]

javascript - 搜索数组并返回结果的最佳方法