我使用formik,我有一个文本字段,用户输入SSN号码。我有一个函数处理SSN号码的格式,如000-00-0000。我在onChange中调用了这个函数,效果很好。但问题是当我试图清除输入字段时,要点击两次才能删除一个数字
const [ssn, setSsn] = useState('');
const normalizeInput = (value: any, previousValue: any) => {
// return nothing if no value
if (!value) return value;
// only allows 0-9 inputs
const currentValue = value.replace(/[^\d]/g, '');
const cvLength = currentValue.length;
if (!previousValue || value.length > previousValue.length) {
// returns: "1", "12", "123"
if (cvLength < 4) return currentValue;
// returns: "123", "123-4", "123-45",
if (cvLength < 7) return `${currentValue.slice(0, 3)}-${currentValue.slice(3)}`;
// returns: "123-45-", "123-45-6", "123-45-67", "123-45-678", "123-45-6789"
return `${currentValue.slice(0, 3)}-${currentValue.slice(3, 5)}-${currentValue.slice(5, 9)}`;
}
};
<form onSubmit={formik.handleSubmit}>
<TextField
name="ssn"
id="ssn"
label="SSN*"
variant="filled"
value={formik.values.ssn}
onChange={(e) => {
setSsn(normalizeInput(e.target.value, ssn));
}}
/>
</form>
1条答案
按热度按时间v8wbuo2f1#
要解决输入字段在单击时未被清除的问题,您可以创建一个单独的清除按钮,并使用状态更新处理输入字段的清除。基于当前代码,您可以进行以下更改:
首先,在表单中添加一个clear按钮:
请注意,按钮有一个type=“button”属性,以防止它提交表单。onClick事件被设置为将ssn状态更新为空字符串,从而有效地清除输入字段。
此外,您需要将TextField组件的值更新为ssn,而不是formik.values.ssn:
现在,当您单击“Clear SSN”按钮时,输入字段应在单击后清除。
下面是修改后的代码片段:
这应该可以解决单击删除按钮时输入字段不被清除的问题。