【问题标题】:React Input type="number" fields don't trigger onChangeReact Input type="number" 字段不会触发 onChange
【发布时间】:2020-09-30 13:22:03
【问题描述】:

我已将<input type="number" value={value} onChange={onChange}> 添加到表单中,并正在使用简化的 onChange 函数检查输入的格式,如以下组件所示:

  export function App() {
    const [value, setValue] = useState("");

    const onChange = (event) => {
      console.log("onChange called", event.target.value);
      setValue(event.target.value);
    };

    return <input type="number" value={value} onChange={onChange} />;
 }

我想通过 onChange 函数中的验证将输入的值限制为仅整数。

但是,在我可以添加验证之前,我注意到当用户输入一个有效的非整数输入时,例如.eE,输入的值不会传递给onChange 函数,因此我无法执行验证。

以下是可用于重现问题的代码框。

向输入字段添加验证以确保输入是整数的最佳方法是什么?

【问题讨论】:

  • 这就是将type='number' 作为属性放入输入字段的全部目的。 HTML 会为您做到这一点。浏览器为您解决了这个问题。为什么需要验证自己?

标签: reactjs input onchange


【解决方案1】:

e 是唯一可以在数字字段中接受的字母,因为它允许使用指数。您可以使用input type="text",但它不会像type="number" 那样为您提供浏览器的本机上下箭头。 pattern 属性会在提交时验证,但不会阻止某人首先输入“e”。在 React 中,您可以使用它来完全阻止在数字输入中键入 'e' 键:

const [symbolsArr] = useState(["e", "E", "+", "-", "."]);
  return (
    <div className="App">
      <input
        type="number"
        onKeyDown={e => symbolsArr.includes(e.key) && e.preventDefault()}
      />
    </div>
  );

Codesandbox演示

【讨论】:

  • 当我在 onKeyDown 上添加 console.log 时没有任何事情发生
  • @AljohnYamaro 复制代码和框链接并在演示中查看。一切正常。
  • 我重新检查了演示并且它有效,道歉我会更新我的反对意见
  • 无法更新显示“您上次对此答案投票是在 8 小时前。除非编辑此答案,否则您的投票现在已锁定。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2016-01-08
  • 2013-09-22
相关资源
最近更新 更多