Front

Ant Design和CompositionEvent

中文输入法(包括CJK输入法)都有的问题:如果<input>上监听input事件,在Win/Mac上每次按键都会触发。例如用拼音输入法输入动漫驿站,用户可能按键d.o.n.g.m.a…会触发13次事件,但其实只需要触发一次处理输入后的结果。早年间有很多trick的做法,比如keyup判断输入框内容是否是中文。现在是可以放心使用composition事件了。

场景是:使用Ant Design的Select搜索框,监听composition,输入结束后再搜索。

macOS 10.15.2
Chrome 79
Ant Design 3.25.2

因为只是输入的判断,使用state/hook反而复杂了,用一个全局变量标记是否正在输入,compositionstart为true,compositionend赋值false,在获取数据前检查这个标记,是false才获取,主要代码如下:

window.isInputing = false;

const Form = (props) => {
  const compositionListener = (e) => {
    window.isInputing = e.type === 'compositionstart';
  };

  const fetchData = (v) => {
    if (window.isInputing === false) {
      fetch();
    }
  };

  return (