实时搜索优化策略:使用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>

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

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

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

相关推荐
深蓝AI8 小时前
Meta 开源用了八年的设计系统 astryx:连坐两天 GitHub 总榜第一,组件库开始写给 agent 的说明书
前端·人工智能
ruanno_top8 小时前
轮播每 3 秒自己翻页:键盘停不下来,读屏也不知道换了页
vue.js
IT_陈寒8 小时前
Vue的watch把我坑惨了,原来要这样用才靠谱
前端·人工智能·后端
1-1=08 小时前
Vue 3 模板语
前端·javascript·vue.js
用户7610304473719 小时前
【转战智能眼镜开发】ROKID AIUI 小游戏 亚马逊标枪项目实战讲解
前端
疯华整猫9 小时前
删掉 LeakCanary 那天,我用 Trae 自己撸了一套:最难的不是分析堆,是决定什么时候 dump
android·人工智能·性能优化
风卿9 小时前
看着AI写代码太孤独了,来欣赏星云吧:一个DSH 装饰插件
前端·javascript
牧艺9 小时前
弹层不用再手算坐标了:CSS Anchor Positioning 从原理到可上线
前端·javascript·css
用户老李9 小时前
YOLO 目标检测自学教程 07:YOLOv3——多尺度预测
前端
moshuying10 小时前
ESP32 墨水屏金价牌(上):从点亮到把图片推过去
前端