e.preventDefault 在 onChange 事件中不起作用,React

问题描述 投票:0回答:1

我正在尝试将输入类型从数字更改为文本,但我希望用户只能输入数字、点或逗号。我编写了 onChange 处理程序,用于检查输入是否仅包含允许的符号并删除所有不包含的符号。在本地它运行良好,但在项目中仍然可以输入输入字母和其他符号。似乎 return 和 e.preventDefault 在那里不起作用。

不起作用的项目代码:

const onChangeMin = (e: React.FormEvent<HTMLElement>) => {
    const node = e.target as HTMLInputElement;

    clearTimeout(timeOut);
    const parent = node.closest('.aside-filters')!.getBoundingClientRect().top;
    const element = node.getBoundingClientRect().top;
    setShowButton(true);
    setTopButton(element - parent);

    timeOut = setTimeout(() => {
      setShowButton(false);
    }, 7000);

    if (node.value.match(/[^0-9.,]/g)) {
      return;
    } else {
      setMinValue(node.value.replace(',', '.'));
    }
  };

运行良好的本地代码:

const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
        if (e.target.value.match(/[^0-9.,]/g)) {
            e.preventDefault()
        } else {
            setValue(e.target.value.replace(',', '.'));
        }
    }

问题出在异步超时上吗?我该如何解决这个问题?

javascript reactjs typescript events onchange
1个回答
0
投票

[顺便说一句,你的例子并不是最小的,因为我们不关心父级、元素或 showButton 和 topPosition。]

return
这里不会做任何事情,只是停止运行函数的其余部分,这里什么也不做。您的代码相当于:

if (!node.value.match(/[^0-9.,]/g)) {
  setMinValue(node.value.replace(',', '.'));
}

如果您想阻止用户键入不同的字符,您可以做的事情可能接近于:

node.value = node.value.replace(/[^0-9.,]/g, '');
setMinValue(node.value.replace(',', '.'));

或者,如果您想让他们输入其他字符,但为了您的操作而删除它们,只需:

setMinValue(node.value.replace(/[^0-9.,]/g, '').replace(',', '.'));
© www.soinside.com 2019 - 2024. All rights reserved.