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>
  );
};
相关推荐
_w_z_j_10 分钟前
Linux----线程互斥与同步
linux·运维·开发语言
云栖梦泽12 分钟前
易语言网络编程基础:构建网络版应用
开发语言
兔老大的胡萝卜36 分钟前
pm2 部署nuxt4项目
javascript·nuxt4
阿蒙Amon39 分钟前
JavaScript学习笔记:17.闭包
javascript·笔记·学习
布茹 ei ai39 分钟前
QtWeatherApp - 简单天气预报软件(C++ Qt6)(附源码)
开发语言·c++·qt·开源·开源项目·天气预报
Wpa.wk41 分钟前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
LinHenrY122742 分钟前
初识C语言(编译和链接)
c语言·开发语言·蓝桥杯
_OP_CHEN42 分钟前
【Python基础】(二)从 0 到 1 入门 Python 语法基础:从表达式到运算符的全面指南
开发语言·python
l1t43 分钟前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
composurext1 小时前
录音切片上传
前端·javascript·css