In my react.js component, when i am trying to start type anything in textField, it is not updating .
I tried with debugger the i found — when first character entered, component re-renderd so looses its prevous states and looks like textField value is not updating.
It was working fine earlier when i was using mui Box instead of Grid, but now removing Grid also is not working .
Same question asked by many people, i went through their provided solution but no luck.
Here is my code :
const Registration = (props: any) => {
const [loading, setLoading] = useState(false);
const [successAlert, setSuccessAlert]=useState(false)
const [formData, setFormData] = useState({
firstName:'',
})
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
submitRegister()
};
const submitRegister = async()=>{
setLoading(true)
axios.post('example.com/create/user',formData)
.then(response =>{
console.log(response.data.code)
if(response.data.code ===200){
setSuccessAlert(true)
setLoading(false)
}
})
.catch(error =>{
console.log(error)
})
}
const handleChangeForm=(e:ChangeEvent<HTMLInputElement>)=>{
const{name ,value }= e.target;
setFormData((prevFormData)=>({
...prevFormData,
[name]:value
}));
};
const FormContainer = styled("form")(({ theme }) => ({
maxWidth: 700,
[theme.breakpoints.down(theme.breakpoints.values.sm)]: {
maxWidth: 300
},
[theme.breakpoints.up(theme.breakpoints.values.md)]: {
maxWidth: 650
}
}));
const StyledTextField = styled(TextField)(() => ({
"& .MuiFormLabel-asterisk": {
color: "red"
},
'& label.Mui-focused': {
color: '#96A8AE', //Dark Grey as per SCM
},
'& .MuiOutlinedInput-root': {
'&.Mui-focused fieldset': {
borderColor: '#96A8AE',
},
},
}));
return (
<Grid container className="registration__container" spacing={2}>
<Grid item xs={7} md={7} lg={7} xl={7}>
<Grid className='left'>
// some code here
</Grid>
{loading &&<Loader /> }
</Grid>
<Grid item xs={5} md={5} lg={5} xl={5} className='registration__form' key="regis-form">
<FormContainer onSubmit={handleSubmit}>
<Grid item container className='details__form' columnSpacing={{ xs: 2, sm: 2, md: 2 }}>
<Grid item xs={6} md={6} lg={6} xl={6}>
<StyledTextField
label="First Name"
name="firstname"
value={formData.firstName}
onChange={handleChangeForm}
key="firstName"
size='medium'
required
fullWidth
/>
</Grid>
</Grid>
<Grid item xs={12} className="submitbtn__wrapper">
<button type="submit">Register</button>
</Grid>
</FormContainer>
</Grid>
</Grid>
);
};
export default Registration;
I also Tried-
React.js – input losing focus when rerendering
React Hooks – Input loses focus when 1 character is typed in
In React ES6, why does the input field lose focus after typing a character?
and other similar question , but did not help me.
2
Answers
I think you are passing
name
prop in TextField incorrectly.For example:
And in your code, you need to move
StyledTextField
andFormContainer
outside of the component to avoid causing unnecessary re-rendering.For example:
There are 2 problems here:
First, you are recreating your styled components
FormContainer
andStyledTextField
on each render, causing them to lose focus on each rerender. This can be fixed by moving both of them outside of theRegistration
component.Second, you have a typo you have in the
name
property of yourStyledTextField
. TryfirstName
(with capital "N") instead.In JavaScript, identifiers are case sensitive. That means that
firstName
andfirstname
will be different properties. Here, you are setting thefirstname
property of yourformData
state, but the value shown by theStyledTextField
isfirstName
, which does not get updated by your change handler.Here’s a working example: https://stackblitz.com/edit/stackblitz-starters-tx9w4d?file=src%2FRegistration.tsx