Reputation: 735
I have a number stored in my React state, and I want to edit it using an <input type="number" />
. Here's my attempt:
function MyNumberInput() {
const [number, setNumber] = useState(42);
return (
<input
type="number"
value={number}
onChange={event => {
setNumber(parseFloat(event.target.value)); // Convert string value to a number!
}}
/>
);
}
The problem is that this code fails during intermediate, non-number states. If I want to enter -12
, I begin by typing the negative sign. When I do, the onChange
handler fires, parseFloat("-")
returns NaN, and the input remains empty. As a user, it feels like my input was completely ignored.
Upvotes: 5
Views: 639
Reputation: 15186
type="number"
parseFloat
to store the string like -
or .0
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [number, setNumber] = useState('');
return (
<div className="App">
<input
value={number}
onChange={event => {
// console.log(event.currentTarget.value);
setNumber(event.target.value);
}}
/>
</div>
);
}
Try it online:
Upvotes: 0
Reputation: 3496
The problem is the input
get NaN
is because the input
type="number" and -
or .
is not a number.
I suggest to use RegEx:
function MyNumberInput() {
const [number, setNumber] = useState(42);
const updateNumber = ({ target }) => {
const reg = new RegExp('^[0-9+-/]+$|^$');
if (reg.test(target.value)) setNumber(target.value);
};
return (
<input type="text" value={number} onChange={updateNumber} />
);
}
Upvotes: 0
Reputation: 544
just use unary plus operator to convert a string into a number like this:
function MyNumberInput() {
const [number, setNumber] = useState(42);
return (
<input
type="number"
value={number}
onChange={event => {
setNumber(+(event.target.value)); // Convert string value to a number!
}}
/>
);
}
Upvotes: 0