I have this setting on my page to set an input automatically to 0 if the input is empty. However, the input does not allow me to enter [or recognise] a decimal/dot. Any ideas why this is happening and how to get around this?
const updateSettings = (e) => {
if(e.target.value === '') {
e.target.value = 0;
} else {
e.target.value -= 0;
}
dispatch({
type: 'UPDATE_SETTINGS',
setting: e.target.name,
value: e.target.type === 'checkbox' ? e.target.checked : e.target.value
})
<input type="text" id="amount" name="amount" value={settings.amount} onChange={(e) => updateSettings(e)} />
Much appreciated, thanks!
CodePudding user response:
The issue is, when target.value
is not empty, you try to minus 0
from it. When the value you enter is a .
this isn't recognise as a valid operation as you're trying to minus a string that can't be parsed to a number (.
) and a number (0-9
).
I'm not sure why you need to minus 0
from target.value
. Either way, if you get rid of your else block it should work.
edit - based on comment
I'm not sure of your exact use case, but there's a few ways you can handle the input field having a zero by default, and let the user replace it with their own value/s. You can use setState
and pass that state to the value
attribute, or you can use defaultValue={0}
. Either one will allow the user to update the field normally.
Alternatively, you can set the type
attribute to number
and this will handle 0-9
and .
as per your requirements.
What you can't have though is, making the input to always set to 0
when the input is empty (as in your if
block), and not have a 0
at the start, given that the user won't be able to delete it.
CodePudding user response:
Thanks to @Kerron for his feedback, this is the solution that works:
if(e.target.value.charAt(0) == '0' && e.target.value > 0) {
e.target.value = e.target.value.substring(1)
}