只有数字.React中的输入数字

lal*_*ala 27 javascript regex reactjs

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

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

渲染输入代码

<input style={{width: '150px'}} type="number" value={this.state.financialGoal} onChange={this.handleChange}/>
Run Code Online (Sandbox Code Playgroud)

zvo*_*ona 31

我试图模仿你的代码,发现有上反应的问题有<input type='number' />.有关解决方法,请检查此示例并自行尝试:https://codepen.io/zvona/pen/WjpKJX?edit = 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;

这种方法最大的一点是当谈到移动时 - >键盘不是数字而是正常的字母格式.

  • “存在问题”是什么意思&gt; 如果存在问题,能否链接到 Github 问题? (4认同)
  • 非常感谢您的`evt.target.validity.valid` !! (2认同)
  • 看来此解决方案无效-https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input/number#Pattern_validation (2认同)
  • 为了使其在移动设备上看起来更好,您可以使用 `&lt;input type="tel" pattern="[0-9*]" ...` 它看起来与数字键盘不完全相同,但相似,而且很多比普通字母键盘更好。 (2认同)

Pha*_* Ky 27

在 React 中的简单方式

<input
      onKeyPress={(event) => {
        if (!/[0-9]/.test(event.key)) {
          event.preventDefault();
        }
      }}
    />
Run Code Online (Sandbox Code Playgroud)

  • 最短的一个: `onKeyPress={(e) =&gt; !/[0-9]/.test(e.key) &amp;&amp; e.preventDefault()}` (10认同)
  • 删除、退格键和 Enter 不起作用 (6认同)
  • 这是最好的解决方案,因为与使用 onChange + setState 相比,它不会移动光标。示例 - 如果您使用 onChange 事件进行过滤,并且值为 9999,如果您尝试在数字之间插入非数字,等等 99a99,光标将跳到最后一个位置。为了让事情变得更好,您还可以添加pattern=[0-9]*来双重检查有效性,并使用type="tel"在移动设备上显示数字键盘。 (3认同)
  • 那么如果用户粘贴一些字符串值会发生什么!!?这不起作用 (3认同)
  • 它在 Chrome android 上不起作用 - 按键已[已弃用](https://developer.mozilla.org/en-US/docs/Web/API/Document/keypress_event) (2认同)

小智 19

一行代码

<input value={this.state.financialGoal} onChange={event => this.setState({financialGoal: event.target.value.replace(/\D/,'')})}/>
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止仅将正整数作为输入的最干净的答案。无论用户如何尝试填充此文本输入(键入和粘贴是最常见的方式),都只允许使用数字。 (2认同)
  • 是的。这个就在这里。我尝试了接受的答案,但 e.target.validity.valid 不断返回 false,即使在匹配模式时也是如此。 (2认同)

Abd*_*UMI 16

  • 要停止输入,请onKeyPress不要使用onChange.

  • 使用event.preventDefault()内部onKeyPress意味着停止按下事件.

  • 由于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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

演示如下

const {Component} = React; 

class Input extends Component {
  

  onKeyPress(event) {
   const keyCode = event.keyCode || event.which;
   const keyValue = String.fromCharCode(keyCode);
    if (/\+|-/.test(keyValue))
      event.preventDefault();
  }
  render() {
  
   return (
   <input style={{width: '150px'}} type="number" onKeyPress={this.onKeyPress.bind(this)} />

   )
  }
 
}

ReactDOM.render(<Input /> , document.querySelector('#app'));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<section id="app"></section>
Run Code Online (Sandbox Code Playgroud)

  • 由于建议在 React 中使用受控组件,所以 `onChange` 就足够了。`onKeyPress` 在某些情况下(例如复制/粘贴)很弱。 (3认同)

Jim*_*may 11

如果您想维护输入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])}
/>
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!

编辑 - 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'));
Run Code Online (Sandbox Code Playgroud)

我在这里有一个关于Codepen的例子

  • 我还要提一下,将输入类型从'number'更改为'tel'可以实现使用数字输入所寻求的许多目标.您仍然可以在移动设备上获得数字小键盘,无论您提供什么输入,您仍然可以完全控制输入.事实上,我认为这是解决这个问题最合理的方式.可能有更完整的方法来做到这一点,但我喜欢'tel'的简单性 (3认同)

小智 5

解

今天,我发现使用parseInt()也是一种很好的清洁做法。onChange(e)下面是一个示例。

码

onChange(e){
    this.setState({[e.target.id]: parseInt(e.target.value) ? parseInt(e.target.value) : ''})
}
Run Code Online (Sandbox Code Playgroud)

说明

  1. parseInt()NaN如果参数不是数字,则将返回。
  2. parseInt('12a') 将返回12。


oma*_*ave 5

我发现最快的方法是添加一个 onKeyPress ,如下所示:

<input 
  type="text" 
  name="example"
  value="Type here"
  onKeyPress={(event) => {
      if (!/[0-9]/.test(event.key)) {
          event.preventDefault();
      }
  }}
>
Run Code Online (Sandbox Code Playgroud)