I'm in the process of learning React. I was doing one of the refractor exercises as below:
import React, { Component } from "react";
import "./App.css";
class App extends Component {
state = {
form: {
firstName: "",
lastName: "",
email: "",
password: ""
}
};
handleFirstNameChange = e => {
this.setState({
form: {
firstName: e.target.value
}
});
};
handleLastNameChange = e => {
this.setState({
form: {
lastName: e.target.value
}
});
};
handleEmailChange = e => {
this.setState({
form: {
email: e.target.value
}
});
};
handlePasswordChange = e => {
this.setState({
form: {
password: e.target.value
}
});
};
validateForm = () => {
const formInputs = ["firstName", "lastName", "email", "password"];
for (let i = 0; i < formInputs.length; i++) {
const inputName = formInputs[i];
if (!this.state.form[inputName].length) {
return false;
}
}
return true;
};
handleSubmit = () => {
if (this.validateForm()) {
console.log("Success!");
} else {
console.log("Failure!");
}
};
render() {
return (
<div
style={{
display: "flex",
justifyContent: "center",
alignItems: "center"
}}
>
<form
className="Form"
onSubmit={e => {
e.preventDefault();
this.handleSubmit();
}}
>
<input name="firstName" onChange={this.handleFirstNameChange} />
<input name="lastName" onChange={this.handleLastNameChange} />
<input name="email" onChange={this.handleEmailChange} />
<input name="password" onChange={this.handlePasswordChange} />
<button className="no-padding">Submit</button>
</form>
</div>
);
}
}
export default App;
and I refactored it to :
import React, { Component } from "react";
import "./App.css";
class App extends Component {
state = {
form: {
firstName: "",
lastName: "",
email: "",
password: ""
}
};
handleChange = e => {
this.setState({
form: {
[e.target.name]: e.target.value
}
});
};
validateForm = () => {
const formInputs = ["firstName", "lastName", "email", "password"];
for (let i = 0; i < formInputs.length; i++) {
const inputName = formInputs[i];
if (!this.state.form[inputName].length) {
return false;
}
}
return true;
};
handleSubmit = () => {
if (this.validateForm()) {
console.log("Success!");
} else {
console.log("Failure!");
}
};
render() {
return (
<div
style={{
display: "flex",
justifyContent: "center",
alignItems: "center"
}}
>
<form
className="Form"
onSubmit={e => {
e.preventDefault();
this.handleSubmit();
}}
>
<input name="firstName" onChange={this.handleChange} />
<input name="lastName" onChange={this.handleChange} />
<input name="email" onChange={this.handleChange} />
<input name="password" onChange={this.handleChange} />
<button className="no-padding">Submit</button>
</form>
</div>
);
}
}
export default App;
For some reason, I got an error when I submit my form -
TypeError: Cannot read property 'length' of undefined
I was wondering what did I do wrong in my code?
Also is there a better way to refactor the code even more?
emailand in array you have defined:emailAddress. Error is becausethis.state.form.emailAddresswill beundefined, and that why Cannot read property 'length' of undefined.