实时搜索优化策略:使用compositionstart、compositionend事件及防抖优化

在构建一款网页应用时,实时搜索是非常重要的一部分。根据用户的键入自动返回相关的搜索结果。即使对于一些复杂和耗费资源的操作也是这样。一种实现这个功能的常见方法是在 input 事件处理器里进行搜索,然而这种方式可能会导致两个问题:性能问题和对拼音输入法的处理问题。

场景代码:

xml 复制代码
<template>
  <div>
    <input type="text" v-model="searchText" @input="search">
  </div>
</template>

<script>
export default {
  data () {
    return {
      searchText: ''
    }
  },
  methods: {
    search () {
      // some expensive operations
    }
  }
}
</script>

在这个例子中,只要用户在文本框中输入,input事件就会触发 search() 方法,进行搜索。例如,其中的搜索操作可能包括向服务器发送请求或进行大量的计算。而如果用户很快速地输入,可能会产生大量的请求或计算,导致性能问题。

另外一个问题是拼音输入法的处理,如果用户正在使用拼音输入法输入字符,在整个拼音输入过程中,浏览器会触发多次 input 事件,可能会导致不必要的搜索。

为了解决这些问题,让我们引用一种更优化的实现方法。

优化后的代码:

xml 复制代码
<template>
  <div>
    <input type="text" v-model="searchText" @compositionstart="composing = true"
      @compositionend="onCompositionEnd">
  </div>
</template>

<script>
import { debounce } from 'lodash';

export default {
  data () {
    return {
      searchText: '',
      composing: false,
      debouncedSearch: debounce(this.search, 300)
    }
  },
  methods: {
    search () {
      // some expensive operations
    },
    onCompositionEnd () {
      this.composing = false;
      this.debouncedSearch();
    }
  }
}
</script>

在这个优化后的代码中,我们引入了两个新的事件处理器 compositionstartcompositionend。当用户使用拼音输入法开始输入时,compositionstart 事件被触发,我那时将 composing 的值设置为 true。当用户完成拼音输入,选择了候选词后,compositionend 事件被触发,我们将 composing 的值设置为 false,并调用 debouncedSearch() 方法进行搜索。

同时,我们引入了 lodash 库的 debounce 函数,它可以创建一个新的函数,在调用时,如果在等待时间(这里是 300 毫秒)内没有再次被调用,那么就执行原函数。对于 debouncedSearch 方法,如果 composing 的值为 true,也就是用户还在输入拼音,那么它将不会执行搜索操作。

通过这种方式,我们解决了 input 事件在拼音输入时的问题,也解决了由于用户快速键入而导致的性能问题。希望文章对你有所帮助。

相关推荐
小二·42 分钟前
Python Web 开发进阶实战:无障碍深度集成 —— 构建真正包容的 Flask + Vue 应用
前端·python·flask
niucloud-admin9 小时前
web 端前端
前端
胖者是谁12 小时前
EasyPlayerPro的使用方法
前端·javascript·css
EndingCoder12 小时前
索引类型和 keyof 操作符
linux·运维·前端·javascript·ubuntu·typescript
liux352812 小时前
Web集群管理实战指南:从架构到运维
运维·前端·架构
沛沛老爹12 小时前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别
java·开发语言·前端·人工智能·架构·企业开发
张彦峰ZYF13 小时前
探索数据的力量:Elasticsearch中指定链表字段的统计查询记录
搜索引擎·性能优化·es
小光学长13 小时前
基于Web的长江游轮公共服务系统j225o57w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库
Joe55614 小时前
vue2 + antDesign 下拉框限制只能选择2个
服务器·前端·javascript
e***985714 小时前
Java性能优化实战:从原理到案例
java·开发语言·性能优化