You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中onChange格式化输入框值时内容丢失的问题

问题原因与解决方案

核心问题

你用了type="number"的输入框,这类输入框只允许输入数字、正负号和小数点(不同浏览器略有差异),空格属于无效字符。当你把带空格的字符串通过setCreditCardNumber设置给输入框的value时,number输入框会自动清空所有无效内容,这就是输入第5个字符(空格)后内容被清空的原因。

修复方案

1. 更换输入框类型

把输入框的type从number改成text,同时通过inputMode="numeric"让移动端弹出数字键盘,pattern="[0-9\s]*"限制输入内容,兼顾体验和输入规范。

2. 优化格式化逻辑

过滤掉非数字字符,避免用户输入字母、符号等,同时处理空值情况,防止match返回null导致报错。

修改后的完整代码:

import { useState } from 'react';

const CreditCardInput = () => {
  const [creditCardNumber, setCreditCardNumber] = useState<string>('');

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    // 过滤所有非数字字符
    const cleanNum = e.target.value.replace(/\D/g, '');
    // 每4位分割并添加空格
    const formattedNum = cleanNum.match(/.{1,4}/g)?.join(' ') ?? '';
    setCreditCardNumber(formattedNum);
  };

  return (
    <input
      type="text"
      inputMode="numeric"
      pattern="[0-9\s]*"
      onChange={handleChange}
      value={creditCardNumber}
      placeholder="XXXX XXXX XXXX XXXX"
    />
  );
};

export default CreditCardInput;

额外说明

  • inputMode="numeric":让移动端浏览器弹出数字键盘,提升输入体验;桌面端可通过pattern配合表单验证提示用户输入数字。
  • replace(/\D/g, ''):全局匹配非数字字符并移除,确保格式化的只有纯数字内容。
  • 这样修改后,输入数字时会自动每4位添加空格,删除内容时也能正常同步格式化结果,不会出现清空问题。

内容的提问来源于stack exchange,提问作者Cookies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:18:19