本文介绍在 react 中通过受

在 React 中, 原生虽支持数字验证,但仍允许用户输入负号(-)和小数点(.),甚至可通过粘贴、开发者工具等方式绕过限制。若业务场景要求绝对只接受无符号整数(如手机号、验证码、ID 编号),必须放弃 type="number",改用 type="text" 配合受控组件 + 输入实时清洗。
✅ 正确做法是:
以下是推荐实现(已修复原代码中的关键错误):
import { useState, useCallback } from 'react';
function NumberOnlyInput() {
const [value, setValue] = useState('');
const handleChange = useCallback((evt: React.ChangeEvent) => {
// ✅ 仅保留数字字符:匹配所有非数字字符并替换为空字符串
const cleaned = evt.target.value.replace(/[^0-9]/g, '');
setValue(cleaned);
}, []);
return (
{
e.preventDefault();
const paste = e.clipboardData.getData('text');
const cleaned = paste.replace(/[^0-9]/g, '');
setValue(prev => prev + cleaned);
}}
/>
);
}
export default NumberOnlyInput; ⚠️ 注意事项:
? 总结:真正的“仅数字”控制不依赖 HTML type,而在于输入即清洗 + 受控状态 + 主动拦截粘贴。该方案简洁、可靠、跨浏览器兼容,适用于所有需要强数字约束的表单场景。