JavaScript 中处理数字和日期输入的方法

valueAsNumber

你可能之前写过这样的代码:

 

export function NumberInput() {
  const [number, setNumber] = useState(0)

  return (
    <input
      type="number"
      value={number}
      onChange={(e) => {
        const num = parseFloat(e.target.value)
        setNumber(num)
      }}
    />
  )
}

这样写没有问题,但其实有一种更好的方式来读取数字值。

我指的是这部分代码:

 

// 🚩 不必要的解析!
const num = parseFloat(e.target.value)

没错,自从 IE10 时代开始,我们就有了更好的方式来获取和设置数字值:

 

// 🤯
const num = e.target.valueAsNumber

因此,更好的解决方案可以是:

 

export function NumberInput() {
  const [number, setNumber] = useState(0)

  return (
    <input
      type="number"
      value={number}
      onChange={(e) => {
        // ✅
        const num = e.target.valueAsNumber
        setNumber(num)
      }}
    />
  )
}

当然,你不需要用 React 来实现这一点。这只是标准的 JavaScript,适用于任何框架。

你同样可以查询一个 DOM 节点并使用它:

 

const myInput = document.querySelector('input.my-input')
const number = myInput.valueAsNumber

而且,重要的是,你也可以对其进行写操作!

 

myInput.valueAsNumber = 123.456

一个小陷阱

valueAsNumber 的类型总是一个数字。因此,如果输入当前没有设置任何值,你将会得到 NaN 作为值。

别忘了…

 

typeof NaN // 'number'

是的,这是 JavaScript 中有趣的部分之一。因此,在将 valueAsNumber 写入期望实际数字的地方之前,确保检查它是否为 NaN

 

const number = myInput.valueAsNumber
if (!isNaN(number)) {
  // 我们实际上有一个“数字”数字
}

valueAsDate

但等等,还有更多!

对于日期输入,我们还有一个很方便的 valueAsDate 属性:

 

export function DateInput() {
  const [date, setDate] = useState(null)

  return (
    <input
      type="date"
      value={date}
      onChange={(e) => {
        // ✅
        const date = e.target.valueAsDate
        setDate(date)
      }}
    />
  )
}

很漂亮。

对于那些不使用 React(或者性能更好的 Qwik,它看起来像 React),你当然也可以用纯 HTML 和 JavaScript 来实现:

 

const myDateInput = document.querySelector('input.my-date-input')
const date = myDateInput.valueAsDate

正如预期的那样,你也可以对其进行写操作:

 

myDateInput.valueAsDate = new Date(0)

没有陷阱

幸运的是,对于 valueAsDate,当输入为空时,我们得到的只是 null

所以你只需检查值是否为真值:

 

const date = myDateInput.valueAsDate
if (date) {
  // 我们得到了一个日期!
}

浏览器支持

这并不是什么新的API。即使这是你第一次了解到这些属性,它们已经存在很多年了,甚至可以追溯到 IE10 时代。

结论

现在我们知道如何使用 valueAsNumber 和 valueAsDate 属性来将数字和日期输入分别处理为真正的数字和日期值。

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/79529.html

(0)
guozi's avatarguozi
上一篇 2024年5月30日 下午6:53
下一篇 2024年5月30日 下午6:55

相关推荐

  • dns被污染怎么修复,dns污染问题

    近日,有报道称I根服务器遭到来自中国大陆的恶意攻击。黑客利用该漏洞篡改I-Root服务器上的数据,导致部分用户无法正常访问海外网站。这种攻击技术被称为“DNS 劫持”,可以将用户引…

    行业资讯 2024年5月6日
    0
  • 济南网络优化

    济南网络优化,这是一个充满魅力的词汇。当我们谈论网络优化时,我们不仅仅是在谈论济南这座城市,更是在谈论一种重要的技术。那么什么是网络优化?它又有着怎样的重要性?关键技术又有哪些?实…

    行业资讯 2024年4月14日
    0
  • 域名被墙了怎么申请解封,域名被墙要去哪解决

    域名屏蔽是一个非常常见的问题,但它会对您网站的运营产生严重影响。如果您发现您的域名被屏蔽,请不要惊慌。首先通过判断域名是否被屏蔽来排查问题,并根据不同情况选择合适的解决方案。作为速…

    行业资讯 2024年5月10日
    0
  • 华为畅享6s配置参数详解

    华为畅享6s,一款备受关注的手机产品。它拥有令人惊艳的外观设计,强大的硬件配置,独具特色的软件功能,以及令人满意的性能表现。今天我们将带您深入了解华为畅享6s的配置参数,从外观到内…

    行业资讯 2024年4月2日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注