← 所有文章

拼音输入法的神奇 API丨onCompositionStart & onCompositionEnd

本文目录

前言

  最近开发遇到了一个很 tricky 的问题,直接上 gif,看了就明白了:

拼音尚未确认时已触发搜索,卡片列表短暂显示无结果

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

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

解决方案

onCompositionStart & onCompositionEnd

  这两个事件确实第一次接触,以 compositionstart event 为例:

MDN 对 compositionstart 的说明:输入法开始组合文本时触发事件
MDN 对 compositionstart event 的解释

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

搜狗拼音输入法正在输入拼音,候选词尚未确认

 

  知道有这个 event 之后,一切也就豁然开朗了,我们可以引入一个 lock 变量,通过 onCompositionStart & onCompositionEnd 来维护;当且仅当 lock 为 false 的时候才触发搜索~

(伪)代码

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

最终效果

等待拼音候选词确认后再搜索,输入过程中保留原有卡片列表

总结

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

留言

欢迎交流想法,也欢迎指出文中的问题。

本文目录

查看大图

在文章里找一找

搜索标题和正文,直接跳到相关章节。