1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Reactのinput type="number"でintegerのみに制限させるには?

Posted at

inputで整数のみを入力させるのは意外と面倒

<input
  type="number"
  value={value}
  onChange={(event) => {
    console.log("event:", event)
    event.target.value
  }}
/>

この状態で. eを打ってもまずeventが飛んでこないので、制御のしようがない。

Screenshot 2024-02-07 at 8.36.05.jpg

なので、例えこういう感じで強制しても、

<input
  type="number"
  value={value}
  onChange={(event) => {
    console.log("event:", event)
    setValue(`${parseInt(event.target.value)}`)
  }}
/>

Screenshot 2024-02-07 at 8.39.49.jpg

10.とか全然出来る。(整数ではあるが、絶対使う側から「なんで?」って言われる)

解決方法

onChangeだとキー入力の補足が出来ないので、onKeyDownを併用する。

import React from "react"
interface Props {}

const ALLOWED = ["-", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Backspace"]

const test: React.FC<Props> = (props) => {
  const [value, setValue] = React.useState("")
  return (
    <input
    type="number"
    value={value}
    onChange={(event) => {
      const newValue = parseInt(event.target.value)
      if (isNaN(newValue)) {
        event.preventDefault()
        return
      }

      setValue(`${newValue}`)
    }}
    onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>) => {
      if (event.key.match(/\d/)) return
      if (ALLOWED.includes(event.key)) return

      // e . その他は無効
      event.preventDefault()
    }}
  />
)
}
export default test
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?