使用输入法还没输入完就触发搜索了?了解一下 onCompositionStart & onCompositionEnd

1,043 阅读1分钟

先直接上场景

20221208134318_rec_.gif 可以明显看到,在搜狗拼音输入法还没有完成输入的时候就已经触发搜索了,此时根据拼音内容(一些英文)去搜索,会搜索不到任何结果,导致 Table 内显示空信息。

这明显不是我们想要的效果,我们所希望的应该是在输入法完成搜索(按下空格或回车后)再去触发搜索框的搜索。

解决方案

onCompositionStart & onCompositionEnd

这两个事件确实第一次接触,放上 compositionstart event 在 MDN 的截图: image.png

简单来说,搜狗拼音输入法就是图中所说的 IME(Input Method Editor),当开启一段 composition session 的时候就会触发这个事件,至于什么是 composition session 呢~ image.png 😝

知道存在这个 event 之后,一切也就豁然开朗了,我们可以维护一个 lock 变量,只有在 lock 为 false 的时候才触发搜索,并通过上述的两个事件来 set 这个 lock 变量~

(伪)代码

  <Input
    onChange={e => setInputVal(e.target.value)}
    onCompositionStart={() => setLock(true)}
    onCompositionEnd={() => setLock(false)}
  />
  useEffect(() => {
    // 输入拼音的情况下,选择了文字才搜索,正在输入拼音时不触发搜索
    !lock && triggerSearch(inputVal);
  }, [lock, inputVal]);

最终效果

20221208141301_rec_.gif

总结

之前我一直以为这不是个前端范畴的问题,是系统层面的,事实证明还是认知局限呀🤣今后还是要多多学习,多多记录。