input框添加验证(如只允许输入数字)中文输入导致显示问题的解决方案

文章目录

input框添加验证(如只允许输入数字)中文输入导致显示问题的解决方案

问题描述

测试环境:react + antd input (react的事件与原生js事件不同,思路是等同的)

实现:假设该input框只允许输入数字,如果输入字符不是数字就替换为空。

1.先关闭验证,在中文输入时,输入框会显示输入的字符。通过打印发现,输入中文时onChange被触发了。

js 复制代码
<Input
     value={phone}
     onChange={(e) => {
     	cons
        setPhone(e.target.value);
     }}
     />
    <span>{phone}</span>
 </div>

2.打开验证,输入字符串时验证正常,但在输入中文时,onChange也会被触发,验证异常。

js 复制代码
const Index= () => {
  const [phone, setPhone] = useState('');
  return (
    <div>
      <Input
        value={phone}
        onChange={(e) => {
          setPhone(e.target.value.replace(/\D/g, '')); 
        }}
      />
      <span>{phone}</span>
    </div>
  );
};

解决办法 onCompositionStart与onCompositionEnd

一下两个事件的触发时机compositionstart>onchange>compositionend

  • compositionstart事件:文本合成系统(如输入法)开始新的输入合成时会触发,比如输入法开始输入中文。
  • compositionend事件:。当文本段落的组成完成或取消时, 事件将被触发,比如中文选择完成。

所以我们的思路是,在进行中文输入的时候onChange回调函数提前退出不做验证;在中文输入完成后,触发验证。

js 复制代码
const Index= () => {
  const [phone, setPhone] = useState('');
  const [flag, setFlag] = useState(false); // 识别是否正在输入中文

  return (
    <div>
      <Input
        value={phone}
        onCompositionStart={(e) => {
          setFlag(true);
        }}
        onCompositionEnd={(e) => {
          setFlag(false);
          setPhone(e.target.value.replace(/\D/g, '')); 
        }}
        onChange={(e) => {
          if(flag)setPhone(e.target.value); // 正在输入中文不验证
          else setPhone(e.target.value.replace(/\D/g, '')); 
        }}
      />
      <span>{phone}</span>
    </div>
  );
};
相关推荐
敢敢のwings几秒前
智元 GO-2 与 AgiBot-World 深度解读
开发语言·后端·golang
yaoxin5211238 分钟前
503. Java 反射 - 编写 ServiceFactory 类
java·开发语言·python
一个帅气昵称啊30 分钟前
.Net C# AI智能体开发-快速开始
开发语言·c#·.net
冬夜戏雪1 小时前
agent的trace 和eval
开发语言·前端·javascript
Sagittarius_A*1 小时前
Burst Lab | PHP 审计 13|反序列化(三):POP 链构造与 Gadget Chain 分析
开发语言·web安全·php·代码审计·反序列化
职场的momo1 小时前
11个后端与AI岗位同时开放:Java、网关、推理优化怎么匹配
java·开发语言·人工智能
蓝速科技1 小时前
蓝速科技丨新旧楼宇混杂场景下会议室预约门牌屏一体化改造方案
开发语言·科技·php
梦想的旅途22 小时前
Python实现企业微信文本消息发送
开发语言·python·企业微信
感谢一路走过的人2 小时前
AGGrid刷新数据后执行筛选
javascript·ag-grid