只有数字。在 React 中输入数字

IT技术 javascript regex reactjs
2021-04-04 16:12:44

我试图从输入中排除减号和加号,但它出错了:

handleChange(event) {
  const value = event.target.value.replace(/\+|-/ig, '');
  this.setState({financialGoal: value});
}

渲染输入代码:

<input style={{width: '150px'}} type="number" value={this.state.financialGoal} onChange={this.handleChange}/>
6个回答

我试图模仿你的代码,并注意到React with <input type='number' />. 如需解决方法,请查看此示例并自行尝试:https : //codepen.io/zvona/pen/WjpKJX?editors=0010

您需要将其定义为普通输入(type='text'),仅使用数字模式:

    <input type="text" pattern="[0-9]*"
     onInput={this.handleChange.bind(this)} value={this.state.financialGoal} />

然后比较输入的有效性:

const financialGoal = (evt.target.validity.valid) ? 
  evt.target.value : this.state.financialGoal;

这种方法的最大警告是当涉及到移动时 --> 键盘不是数字而是正常的字母格式。

“有一个问题”是什么意思">如果有的话,你可以链接到 Github 问题吗?
2021-05-24 16:12:44
为了使它在移动设备上看起来更好,您可以使用<input type="tel" pattern="[0-9*]" ...它看起来与数字键盘不完全相同,但相似,并且比常规字母键盘好得多。
2021-06-03 16:12:44
const FinancialGoal = e.target.validity.valid || e.target.value === '' ? e.target.value : this.state.financialGoal 将允许模式为空,否则你会被一个分钟卡住。1位数
2021-06-07 16:12:44
2021-06-09 16:12:44
非常感谢你evt.target.validity.valid!!
2021-06-20 16:12:44

一行代码

<input value={this.state.financialGoal} onChange={event => this.setState({financialGoal: event.target.value.replace(/\D/,'')})}/>
对。这个就在这里。我尝试了接受的答案,但 e.target.validity.valid 一直返回 false,即使匹配模式也是如此。
2021-06-12 16:12:44
这是迄今为止仅将正整数作为输入的最干净的答案。无论用户如何尝试填充此文本输入(键入和粘贴是最常见的方式),都只允许使用数字。
2021-06-16 16:12:44

在 React 中的简单方式

<input
      onKeyPress={(event) => {
        if (!/[0-9]/.test(event.key)) {
          event.preventDefault();
        }
      }}
    />
👆最干净的解决方案👆
2021-05-28 16:12:44
这是最好的解决方案,因为与使用 onChange + setState 相比,它不会移动光标。示例 - 如果您使用 onChange 事件进行过滤,并且值为 9999,如果您尝试在数字之间插入非数字等 99a99,则光标将跳到最后一个位置。为了让事情更上一层楼,您还可以添加 pattern=[0-9]* 以仔细检查有效性,并使用 type="tel" 在移动设备上显示数字键盘。
2021-06-01 16:12:44
这是迄今为止最好的解决方案!谢谢!
2021-06-03 16:12:44
那么如果用户粘贴一些字符串值会发生什么??它不起作用
2021-06-11 16:12:44
最短的一个: onKeyPress={(e) => !/[0-9]/.test(e.key) && e.preventDefault()}
2021-06-17 16:12:44

如果您想保持输入type='number'(可能用于移动设备触发数字键盘),您应该使用onInput而不是onChange捕获您的事件更改。

使用onInput修复了一个错误,即在数字输入中输入文本会绕过我在onChange. 一旦我修复了要在onInput其中调用的此函数,它就会在所有情况下触发。

这是我正在做的一个例子:

<input
    type='number'
    id={`player${index}Score`}
    className='form-control'
    pattern='[0-9]{0,5}'
    onInput={(event) => this.enterScore(event, index)}
    value={this.props.scoreLabel(this.state.scores[index])}
/>

我希望这有帮助!

编辑 - 08-03-2018:

我想出了一个更好的解决方案。在输入组件本身中使用 type='tel' 和模式正则表达式。

我如何连接它的螺母和螺栓在这里:

class Input extends React.Component {
  state = {message: '3'};

  updateNumber = (e) => {
    const val = e.target.value;
    // If the current value passes the validity test then apply that to state
    if (e.target.validity.valid) this.setState({message: e.target.value});
    // If the current val is just the negation sign, or it's been provided an empty string,
    // then apply that value to state - we still have to validate this input before processing
    // it to some other component or data structure, but it frees up our input the way a user
    // would expect to interact with this component
    else if (val === '' || val === '-') this.setState({message: val});
  }

  render() {
    return (
      <input
        type='tel'
        value={this.state.message}
        onChange={this.updateNumber}
        pattern="^-?[0-9]\d*\.?\d*$"
      />
    );
  }
}

ReactDOM.render(<Input />, document.getElementById('main'));

我在这里有一个在Codepen 上工作的例子

只有解决了我的问题的答案。谢谢!
2021-05-29 16:12:44
我还应该提到,将输入类型从“数字”更改为“电话”可以通过使用数字输入来实现许多目标。您仍然可以在移动设备上使用数字小键盘,并且您仍然可以完全控制输入,无论您提供什么输入。事实上,我认为这是简单地解决这个问题的最合乎逻辑的方法。可能有更完整的方法来做到这一点,但我喜欢“电话”的简单性
2021-06-05 16:12:44
惊人的答案!
2021-06-15 16:12:44
  • 要停止输入,请使用onKeyPressnot onChange

  • 使用event.preventDefault()insideonKeyPress意味着停止按下事件。

  • 由于keyPress之前触发处理程序onChange,您必须检查按下的键 ( event.keyCode),而不是输入 ( event.target.value)的当前值

    onKeyPress(event) {
      const keyCode = event.keyCode || event.which;
      const keyValue = String.fromCharCode(keyCode);
      if (/\+|-/.test(keyValue))
        event.preventDefault();
    }
    

演示如下👇🏻

既然推荐在 React 中使用受控组件onChange就足够了。onKeyPress在复制/粘贴等某些情况下很弱。
2021-05-24 16:12:44
这个例子是否仅仅因为类型设置为数字而不起作用?
2021-05-31 16:12:44
@ThulaniChivandikwa - 此示例的工作原理是使用type="number"拒绝除0-9+-. 然后它测试+-,抑制那些。
2021-06-10 16:12:44