I have created a form and connected it to server.
<form>
<h2>Create Account</h2>
<fieldset>
<label for="name">Username</label>
<input
onChange={(e) => handle(e)}
value={data.name}
type="text"
id="name"
name="name"
/>
<label for="email">Email</label>
<input
onChange={(e) => handle(e)}
value={data.email}
type="email"
id="email"
name="email"
/>
<label for="password">Password</label>
<input
onChange={(e) => handle(e)}
value={data.password}
type="text"
id="password"
name="password"
/>
<label for="confirmPassword">Confirm Password</label>
<input
onChange={(e) => handle(e)}
value={data.confirmPassword}
type="text"
id="confirmPassword"
name="confirmPassword"
/>
</fieldset>
<button type="submit" onClick={(e) => sendData(e)}>
Create Account
</button>
</form>
In case of validation error response is like this “message”: “ValidationError: confirmPassword: Confirm Password did not match“
By regular expression I can pic up the error from this message e.g. “Confirm password did not match“.
I don’t know how to show this error below respective input field ?
Advertisement
Answer
- In reducer, you should create the validation function
const reducer = combineReducers({
form: formReducer.validation({
loginValidation: loginValidation,
})
})
const loginValidation = values => {
const errors = {}
if (!values.email) {
errors.email = 'Required'
} else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$/i.test(values.email)) {
errors.email = 'Invalid email address'
}
if (!values.password) {
errors.age = 'Required'
}
if (!values.confirmPassword) {
errors.age = 'Required'
}
if (values.confirmPassword !== values.password) {
errors.age = 'Confirm Password did not match'
}
return errors
}
- In form component, you should do sth like
<div>
<label>Email</label>
<Field name="email" component={email =>
<div>
<input type="text" {...email} placeholder="Email"/>
{email.touched && email.error && <span>{email.error}</span>}
</div>
}/>
</div>