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>
  );
};
相关推荐
xvmingjiang5 分钟前
Vue 3 中监听多个数据变化的几种方法
前端·javascript·vue.js
我有一只臭臭6 分钟前
ES5 和 ES6 类的实现
前端·javascript·es6
2401_845417459 分钟前
set和map
java·开发语言
2301_8210465221 分钟前
Python的深度学习
开发语言·javascript·ecmascript
小高00731 分钟前
🤔函数柯里化:化繁为简的艺术与实践
前端·javascript·面试
却尘34 分钟前
React useMemo 依赖陷阱:组件重挂载,状态无限复原
前端·javascript·react.js
Asort38 分钟前
JavaScript 从零开始(三):浏览器控制台与VS Code协同工作环境搭建详解
前端·javascript
葡萄城技术团队1 小时前
浏览器为啥要对 JavaScript 定时器“踩刹车”?
javascript
扯淡的闲人1 小时前
多语言编码Agent解决方案(2)-后端服务实现
开发语言·python·深度学习
m0_616188491 小时前
el-table的隔行变色不影响row-class-name的背景色
前端·javascript·vue.js