javascript 单击删除按钮时输入字段不清除,只能双击

wvt8vs2t  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(118)

我使用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>
v8wbuo2f

v8wbuo2f1#

要解决输入字段在单击时未被清除的问题,您可以创建一个单独的清除按钮,并使用状态更新处理输入字段的清除。基于当前代码,您可以进行以下更改:
首先,在表单中添加一个clear按钮:

<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));
    }}
  />
  <button type="button" onClick={() => setSsn('')}>
    Clear SSN
  </button>
</form>

请注意,按钮有一个type=“button”属性,以防止它提交表单。onClick事件被设置为将ssn状态更新为空字符串,从而有效地清除输入字段。
此外,您需要将TextField组件的值更新为ssn,而不是formik.values.ssn:

<TextField
  name="ssn"
  id="ssn"
  label="SSN*"
  variant="filled"
  value={ssn}
  onChange={(e) => {
    setSsn(normalizeInput(e.target.value, ssn));
  }}
/>

现在,当您单击“Clear SSN”按钮时,输入字段应在单击后清除。
下面是修改后的代码片段:

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) {
    if (cvLength < 4) return currentValue;
    if (cvLength < 7) return `${currentValue.slice(0, 3)}-${currentValue.slice(3)}`;
    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={ssn}
    onChange={(e) => {
      setSsn(normalizeInput(e.target.value, ssn));
    }}
  />
  <button type="button" onClick={() => setSsn('')}>
    Clear SSN
  </button>
</form>

这应该可以解决单击删除按钮时输入字段不被清除的问题。

相关问题