实时搜索优化策略:使用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 事件在拼音输入时的问题,也解决了由于用户快速键入而导致的性能问题。希望文章对你有所帮助。

相关推荐
用户14567756103727 分钟前
文件太大传不了?用它一压,秒变合格尺寸!
前端
用户14567756103728 分钟前
再也不用一张张处理了!批量压缩神器来了,快收藏
前端
心.c44 分钟前
一套完整的前端“白屏”问题分析与解决方案(性能优化)
前端·javascript·性能优化·html
white-persist1 小时前
【burp手机真机抓包】Burp Suite 在真机(Android and IOS)抓包手机APP + 微信小程序详细教程
android·前端·ios·智能手机·微信小程序·小程序·原型模式
俺会hello我的1 小时前
舒尔特方格开源
前端·javascript·开源
lbh1 小时前
Chrome DevTools 详解(二):Console 面板
前端·javascript·浏览器
ObjectX前端实验室1 小时前
【react18原理探究实践】更新阶段 Render 与 Diff 算法详解
前端·react.js
wxr06162 小时前
部署Spring Boot项目+mysql并允许前端本地访问的步骤
前端·javascript·vue.js·阿里云·vue3·springboot
万邦科技Lafite2 小时前
如何对接API接口?需要用到哪些软件工具?
java·前端·python·api·开放api·电商开放平台
知识分享小能手2 小时前
微信小程序入门学习教程,从入门到精通,WXSS样式处理语法基础(9)
前端·javascript·vscode·学习·微信小程序·小程序·vue