【问题标题】:React: Bind number input to state (handle intermediate values)React:将数字输入绑定到状态(处理中间值)
【发布时间】:2020-03-18 02:31:58
【问题描述】:

我的 React 状态中存储了一个数字,我想使用 <input type="number" /> 对其进行编辑。这是我的尝试:

function MyNumberInput() {
  const [number, setNumber] = useState(42);

  return (
    <input
      type="number"
      value={number}
      onChange={event => {
        setNumber(parseFloat(event.target.value)); // Convert string value to a number!
      }}
    />
  );
}

Try it on JSFiddle.

问题在于此代码在中间的非数字状态下失败。如果我想输入-12,我首先要输入负号。当我这样做时,onChange 处理程序触发,parseFloat("-") 返回 NaN,并且输入保持为空。作为用户,感觉我的输入被完全忽略了。

【问题讨论】:

  • parseFloat 不需要,请删除
  • 真的需要解析吗? parseFloat 我相信在某些极端情况下使用。
  • @iamhuynq event.target.value 是一个字符串,即使对于 type="number" 的输入也是如此。我想在状态中保存一个数字。
  • 也可以使用 setNumber(Math.trunc(event.target.value))
  • 那篇文章解决了您的问题吗?请提供一些反馈将不胜感激。见What should I do when someone answers my question?

标签: javascript reactjs


【解决方案1】:

只需使用一元加号运算符将字符串转换为数字,如下所示:

function MyNumberInput() {
  const [number, setNumber] = useState(42);

  return (
    <input
      type="number"
      value={number}
      onChange={event => {
        setNumber(+(event.target.value)); // Convert string value to a number!
      }}
    />
  );
}

【讨论】:

    【解决方案2】:

    使用正则表达式

    问题是input 得到NaN 是因为input type="number" 和-. 不是数字。

    我建议使用正则表达式:

    function MyNumberInput() {
      const [number, setNumber] = useState(42);
    
      const updateNumber = ({ target }) => {
        const reg = new RegExp('^[0-9+-/]+$|^$');
        if (reg.test(target.value)) setNumber(target.value);
      };
    
      return (
        <input type="text" value={number} onChange={updateNumber} />
      );
    }
    

    【讨论】:

      【解决方案3】:
      1. 您可能需要移除以下道具以启用非数字内容输入。
      type="number"
      
      1. 并删除parseFloat 以存储字符串,如-.0
      import React, { useState } from "react";
      
      import "./styles.css";
      export default function App() {
        const [number, setNumber] = useState('');
        return (
          <div className="App">
            <input
              value={number}
              onChange={event => {
                // console.log(event.currentTarget.value);
                setNumber(event.target.value);
              }}
            />
          </div>
        );
      }
      

      在线试用:

      【讨论】:

      • 这并不能解决原来的问题。我需要输入以允许临时存储非数字值,例如-.。这是必需的,以便用户可以不间断地键入-12.5
      • @PullJosh 答案已更新,请查看将不胜感激
      猜你喜欢
      • 2020-09-09
      • 2019-07-28
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      相关资源
      最近更新 更多