解决 input 输入框在中文输入法下的 bug

部署运行你感兴趣的模型镜像

最近本山人在项目的开发过程中遇到这么一个问题:

在列表中嵌入antd的Input输入框,切换到微软输入法输入时,就不能成功输入中文字符,然而搜狗输入法又是正常的。

研究一番,发现是input的value这王八蛋在搞事情,每次输入都会调用onChange事件。而搜狗输入法和微软的输入法对onChange调用机制不同,所以就会出现这种情况(至于有何不同,在这里就不做陈述了,麻烦各位自行问度娘)。

解决方法:对input框进行二次封装,对onChange调用机制进行处理。

话不多说,直接撸代码才是王道(这里封装的比较简单,因为本山人的项目对input框的需求不多,各位看官可自行完善)

import React, { Component, createRef } from 'react';
import PropTypes from 'prop-types';

class ControlledInput extends Component {

  inputRef = createRef();

  isOnComposition = false;

  componentDidMount() {
    this.setInputValue();
  }

  componentDidUpdate() {
    this.setInputValue();
  }

  setInputValue = () => {
    this.inputRef.current.value = this.props.value || ''
  };

  handleComposition = evt => {
    if (evt.type === 'compositionend') {
      this.isOnComposition = false;

      // 谷歌浏览器:compositionstart onChange compositionend
      // 火狐浏览器:compositionstart compositionend onChange
      if (navigator.userAgent.indexOf('Chrome') > -1) {
        this.onChange(evt);
      }

      return;
    }

    this.isOnComposition = true;
  };

  onChange = evt => {
    if (!this.isOnComposition) {
      this.props.onChange(evt);
    }
  };

  render() {
    const commonProps = {
      onChange: this.onChange,
      onCompositionStart: this.handleComposition,
      onCompositionUpdate: this.handleComposition,
      onCompositionEnd: this.handleComposition,
    };
    return <input
      ref={this.inputRef}
      type="text"
      style={{ width: '100%', border: '0.1px solid #e8e8e8', outlineColor:'#e8e8e8' }}
      {...commonProps}
    />
  }
}

ControlledInput.propTypes = {
  onChange: PropTypes.func
};

ControlledInput.defaultProps = {
  onChange: () => { }
};

export default ControlledInput;

各位看官,在下也不想装逼,实则有人已对此问题做过详细描述了,看在各位已经看过本山人文章的份上,就透露给大家吧,以表各位一览之恩:解决 React 中的 input 输入框在中文输入法下的 bug

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值