input type='number' 可以输入e问题的解决方案

前言:我们日常开发中会遇到input的不同type的使用,比如说 checkbox、file、date、time......

其中type='number' 这个类型相信大家也遇到可以输入"e"的问题:

先看代码:

js 复制代码
import React, { useState } from 'react';

function App() {
  const [value, setValue] = useState('');
  const handleInput = (e) => {
    const input = e.target.value;
   
      setValue(input);
   
  };
  return (
    <>
      <input type='number' value={value} onChange={handleInput} />
    </>
  );
}

export default App;

输入后发现还可以输入 "e"?(同样问题在Material UI 的TextField使用中,也会出现该问题)

input type='number' 中为什么可以输入"e"呢?以下为百度搜索的资料

在HTML的input元素中,type属性为"number"的输入框通常用于接收数字输入。然而,即使设置了"type=number",输入框仍然允许输入科学计数法表示的数字,包括 "e" 或 "E"。

科学计数法是一种表示非常大或非常小的数字的方法,通过使用乘以10的幂来表示。例如,1亿可以表示为1e8,0.000001可以表示为1e-6。

因此,当用户在"type=number"的输入框中输入类似于"1e8"或"1e-6"的值时,浏览器会将其解释为相应的科学计数法表示的数字,并将其视为有效的输入。但需要注意的是,并非所有浏览器都支持科学计数法的输入,因此在实际使用中可能会有一些差异。


我想到的方法:在setValue之前加个正则判断,为纯数字才让它set进去

前言:

1、在if判断中需要加 input==="" , 因为可以让输入的数字清空

js 复制代码
function App() {
  const [value, setValue] = useState('');
  const handleInput = (e) => {
    const reg = /^\d+$/;
    const input = e.target.value;
    if (reg.test(input) || input === '') {
      console.log('输入的值为:', input);
      setValue(input);
    }
  };
  return (
    <>
      <input type="number" value={value} onChange={handleInput} />
    </>
  );
}

我在此处连续输入:123e45 结果会存在帮我清空输入框的问题

造成分析: 当我输入123e的时候,控制台输出:输入的值为空==>""(什么原因我也不清楚),因为输入的值变成了"" ,所以进入到我们if判断中的input==="",所以setValue成功

解决方法:换个思路把 input 标签中的 type="number"删除,把他当做一个普通的输入框去使用,再使用纯数字的正则去匹配value

js 复制代码
import React, { useState } from 'react';

function App() {
  const [value, setValue] = useState('');
  const handleInput = (e) => {
    const reg = /^\d+$/;
    const input = e.target.value;
    if (reg.test(input) || input === '') {
      console.log('输入的值为:', input);
      setValue(input);
    }
  };
  return (
    <>
      <input value={value} onChange={handleInput} />
    </>
  );
}

export default App;

上图:我再次输入:123e456

问题已经解决!

总结:没什么难点,只是一开始的方向有错误,换一种思维!!!

相关推荐
用户033307413955 小时前
TypeScript using 与 AsyncDisposableStack:在真实服务端代码中协调多资源清理
前端
daisychey5 小时前
用 Playwright 做多平台内容分发,我踩过的 8 个坑
前端
IT_陈寒7 小时前
为什么你应该学习JavaScript?
前端·人工智能·后端
大龄秃头程序员7 小时前
iOS冷启动监控Demo
前端
光影少年7 小时前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法
掘金酱7 小时前
[稀土掘金 × 火山引擎] AI用量周榜冲刺赛|获奖名单公示
前端·人工智能·后端
泡泡oO8 小时前
“如果你还在用Superpowers,那我不要和你说话”
前端·后端·全栈
维克兜率天8 小时前
趋势过滤:避免被“假突破“反复打脸
前端
8年区块链老兵8 小时前
一篇文章教会你:用区块高度读懂比特币链上的每一笔交易
前端
xixichensh8 小时前
前端转做AI程序员第一步——开发一个AI流式对话Demo
前端