【问题标题】:How to prevent user from entering negative number in react?如何防止用户在反应中输入负数?
【发布时间】:2021-06-13 09:44:45
【问题描述】:

我想限制用户输入负值。我正在使用 min =“0”。有了这个,我可以限制用户递减到 0,即用户只能递减值直到 0。但他们可以输入“-”。 react js中如何防止。

https://codesandbox.io/s/react-input-example-forked-xnvxm?file=/src/index.js

<input
   type="number"
   min="0"
   step="1"                        
   onChange={this.handleChange}                        
   className="w-100"
   value= "1"
   />

【问题讨论】:

标签: javascript reactjs web ecmascript-6 frontend


【解决方案1】:

处理空输入和负数

// Converting App into Class-Component
class App extends React.Component {
  // Set State
  constructor(props) {
    super(props);
    this.state = {
      number: ""
    };
  }

  render() {
    return (
      <div className="App">
        <input
          type="number"
          min="0"
          step="1"
          onChange={(e) => {
            let val = parseInt(e.target.value, 10);
            if (isNaN(val)) {
              this.setState({ number: "" });
            } else {
              // is A Number
              val = val >= 0 ? val : 0;
              this.setState({ number: val });
            }
          }}
          className="w-100"
          // Assign State
          value={this.state.number}
        />
      </div>
    );
  }
}

【讨论】:

  • 真的很喜欢你的解决方案!
【解决方案2】:

您可以向输入元素添加一个onKeyPress 侦听器,该侦听器将在onChange 之前触发,并调用一个函数来防止按下减号按钮时的默认行为。

const preventMinus = (e) => {
    if (e.code === 'Minus') {
        e.preventDefault();
    }
};

<input               
  type="number"
  min="0"
  onKeyPress={preventMinus}
/>

请注意,这仍然允许将负值粘贴到输入中。为此,您可以添加一个onPaste 侦听器并检查剪贴板数据以查看它是否为负数并防止默认行为。

const preventPasteNegative = (e) => {
    const clipboardData = e.clipboardData || window.clipboardData;
    const pastedData = parseFloat(clipboardData.getData('text'));

    if (pastedData < 0) {
        e.preventDefault();
    }
};

<input               
  type="number"
  min="0"
  onPaste={preventPasteNegative}
  onKeyPress={preventMinus}
/>

【讨论】:

    【解决方案3】:

    您可以在设置输入状态之前使用正则表达式验证输入,并将输入值与您的状态值同步。

    
    <input
      type="number"                  
      onChange={this.handleChange}                        
      className="w-100"
      value= {this.state.inputVal}
    />
    
    validateNumber = (value) => {
      //true for digits only.
      const regex = /^[0-9]+$/
      return regex.test(value);
    }
    handleChange = ({target}) => {
      const {name,value} = target;
      const {inputVal} = this.state;
    
      if(value === '') {
        return this.setState({inputVal:''});
      }
    
      if(this.validateNumber(value)) {
        this.setState({inputVal:value})
      } else {
        this.setState({inputVal:inputVal})
      }
    }
    
    

    【讨论】:

      【解决方案4】:

      使用一些本地组件状态来保存输入的值并使用Math.max(0, value) 确保value 属性/属性是非负值。输入的值将是 onChange 处理程序中的字符串,因此请记住将其强制转换回状态的数字值。

      function App() {
        const [value, setValue] = React.useState(0);
        return (
          <div className="App">
            <label>
              Try entering a negative value
              <input
                type="number"
                min="0"
                step="1"
                className="w-100"
                value={value && Math.max(0, value)}
                onChange={e => setValue(e.target.value ? Number(e.target.value) : e.target.value)}
              />
            </label>
          </div>
        );
      }
      
      const rootElement = document.getElementById("root");
      ReactDOM.render(<App />, rootElement);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
      <div id="root"></div>

      【讨论】:

      • 我试过sn-p,一旦出现0,你就无法摆脱它(除非你使用向上/向下箭头)。
      • @Christophe 为我工作。您是指无法退格/删除 0 以使输入为空吗?
      • 对!我就是这个意思。
      • @Christophe 小调整以允许空字符串值。你现在应该可以删除0了。
      【解决方案5】:

      您可以在handlechange 中过滤掉输入值。像这样的:

      const App = () => {
        const [value, setValue] = useState("");
      
        const handleChange = (e) => {
          if (!isNaN(e.target.value)) {
            setValue(e.target.value);
          }
        };
        return (
          <div className="App">
            <input
              type="text"
              value={value}
              onChange={handleChange}
              className="w-100"
            />
          </div>
        );
      };
      
      

      这里是演示:https://codesandbox.io/s/react-input-example-forked-kr2xc?file=/src/index.js

      【讨论】:

        【解决方案6】:

        其他解决方案对我不起作用(我可以通过滚动鼠标滚轮或触控板输入负数),所以我做了一种硬编码方法:

        onChange={function (event) {
          if (value > 0 || event.target.valueAsNumber >= 0) {
            setValue(event.target.valueAsNumber);
          }
        }}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 2021-12-12
          • 2014-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多