美文网首页
解决中文输入频繁触发事件的问题

解决中文输入频繁触发事件的问题

作者: 雨文虫 | 来源:发表于2019-12-18 22:04 被阅读0次

应用场景

输入框自动完成功能,如下图,当我们输入文字时,依据我们输入的文字,调用接口进行提示。


image.png

问题

当输入的是中文的时候,input框的onchange事件会随着我们按下键盘的每一次被不断的被触发。

解决方案

1.防抖和节流

可以减少接口的调用次数,但是不能准确的捕获到我们的输入内容。

2.通过input的compositionstart和compositionend监听中文输入的开始和结束

通过对输入中文时候的特殊处理,在恰当的时机触发事件。

实现代码

以下是对antd组件AutoComplete进行了二次封装

import React, { useState } from 'react';
import { Input, AutoComplete } from 'antd';
import PropTypes from 'prop-types';

const { Option } = AutoComplete;

const AotoComplete = React.forwardRef(
  ({ searchCallback, dataSource = [], onChange, value, selectCallback, fieldsLabel }, ref) => {
    const [compositionFlag, setCompositionFlag] = useState(false);

    const handleSelect = (val, option) => {
      onChange && typeof onChange === 'function' && onChange(option.props.children);
      selectCallback && typeof selectCallback === 'function' && selectCallback(val);
    };

    const handleCompositionstart = () => {
      setCompositionFlag(true);
    };

    const handleCompositionend = (e) => {
      setCompositionFlag(false);
      searchCallback(e.target.value);
    };

    const handleInput = (e) => {
      onChange && typeof onChange === 'function' && onChange(e.target.value);
      if (!compositionFlag) {
        searchCallback && typeof searchCallback === 'function' && searchCallback(e.target.value);
      }
    };

    const options = dataSource.map((item) => (
      <Option key={item[fieldsLabel.key]}>{item[fieldsLabel.val]}</Option>
    ));
    return (
      <AutoComplete
        placeholder=""
        dataSource={options}
        onSelect={handleSelect}
        defaultValue={value}
        ref={ref}
      >
        <Input
          onCompositionStart={handleCompositionstart}
          onCompositionEnd={handleCompositionend}
          onInput={handleInput}
        />
      </AutoComplete>
    );
  },
);
export default AotoComplete;

AotoComplete.propTypes = {
  dataSource: PropTypes.arrayOf(PropTypes.object).isRequired,
  fieldsLabel: PropTypes.shape({
    key: PropTypes.string,
    val: PropTypes.string,
  }).isRequired,
  value: PropTypes.string,
  searchCallback: PropTypes.func,
  onChange: PropTypes.func,
  selectCallback: PropTypes.func,
};
AotoComplete.defaultProps = {
  searchCallback: null,
  onChange: null,
  selectCallback: null,
};

相关文章

  • 解决中文输入频繁触发事件的问题

    应用场景 输入框自动完成功能,如下图,当我们输入文字时,依据我们输入的文字,调用接口进行提示。 问题 当输入的是中...

  • 文本输入与函数防抖

    在中文输入法状态中,每键入一个拼音都会触发input事件,造成频繁回调。通常有以下两种解决方案 改变触发事件 改为...

  • input 事件兼容 以及 中文输入优化

    bug ios 输入中文时 会触发多次input事件 解决方法 引入两个事件compositionstart和 c...

  • input框 中文模式 拼音问题

    问题:input需要监听变化,在使用中文模式进行输入时,页面上的拼音会引起变化,触发事件发送接口解决方法:将@ch...

  • [ JavaScript专题 ]笔记 - 防抖功能

    一、页面防抖 主要是要解决事件频繁触发的问题。 执行上面代码,会在鼠标经过div时,频繁调用getUserActi...

  • UISwitch的那些坑

    主要就是基于事件UIControlEventValueChanged的回调问题 坑1:事件频繁触发 触发条件:拖动...

  • 中文输入法触发oninput事件解决办法

    oninput事件 在移动端,中文输入的过程当中,输入框默认会显示英文字母,会触发oninput事件,但是输入还没...

  • 自定义事件:textchange

    textchange应用场景 中文输入法在输入拼音时就会触发input事件 compositionstart和co...

  • js 防抖动

    问题:针对频繁触发scoll resize绑定的事件函数,有可能短时间多次触发时事件,影响性能。思路:多个函数调用...

  • 事件节流

    如果不希望用户频繁触发某个事件,可以采用事件节流的方法解决,在短时间(可设置)内连续触发,只会执行一次事件。 在低...

网友评论

      本文标题:解决中文输入频繁触发事件的问题

      本文链接:https://www.haomeiwen.com/subject/xelpnctx.html