Предполагая, что вы используете Semanti c UI для стилизации вашего компонента, вы можете использовать error
prop вашего <Form.Field />
, чтобы вызвать ошибку, если форма недействительна.
Чтобы отслеживать Если форма действительна, вы можете использовать свое состояние. В качестве опции вы можете установить свойство disabled
кнопки Submit
равным переменной состояния, указывающей, действительна ли форма.
Самая основная c проверка формы (для соответствия образцу одной заглавной буквы с последующими строчными буквами) вы можете найти в следующей живой демонстрации:
const { Component } = React,
{ render } = ReactDOM,
{ Form, Input, Button } = semanticUIReact
const rootNode = document.getElementById('root')
class App extends Component {
state = {
submitAttempted: false,
isValid: {
contactName: false,
contactPhone: false,
contactMail: false
}
}
validateInput = (name,value) => {
switch(name){
case 'contactName' : {
if(/^[A-Z][a-z]+$/.test(value)){
return true
} else return false
}
case 'contactPhone' : {
if(/^\d+$/.test(value)){
return true
} else return false
}
case 'contactMail' : {
if(/^\w+@\w+\.\w{1,4}$/i.test(value)){
return true
} else return false
}
default: return false
}
}
onChange = ({target:{name,value}}) =>
this.setState({
[name]: value,
isValid: {
...this.state.isValid,
[name]: this.validateInput(name, value)
}
})
onSubmit = e => {
e.preventDefault()
this.setState({
submitAttempted: true
})
Object.values(this.state.isValid).every(Boolean) &&
console.log(this.state.contactName, this.state.contactPhone, this.state.contactMail)
}
render(){
return (
<Form onSubmit={this.onSubmit} >
<Form.Field
name="contactName"
className=""
control={Input}
label="Contact Name"
placeholder="Contact Name"
value={this.state.contactName || ''}
onChange={this.onChange}
required
error={(
(this.state.submitAttempted && !this.state.isValid.contactName) &&
{
content: 'Valid contact name should contain upper-case letters followed by lower-case letters',
pointing: 'below'
}
)}
/>
<Form.Field
name="contactPhone"
className=""
control={Input}
label="Contact Phone"
placeholder="Contact Phone"
value={this.state.contactPhone || ''}
onChange={this.onChange}
required
error={(
(this.state.submitAttempted && !this.state.isValid.contactPhone) &&
{
content: 'Valid phone, should contain numbers only',
pointing: 'below'
}
)}
/>
<Form.Field
name="contactMail"
className=""
control={Input}
label="Contact Mail"
placeholder="example@hello.com"
value={this.state.contactMail || ''}
onChange={this.onChange}
required
error={(
(this.state.submitAttempted && !this.state.isValid.contactMail) &&
{
content: 'Valid e-mail format should be fulfilled',
pointing: 'below'
}
)}
/>
<Button
type="submit"
disabled={
this.state.submitAttempted &&
!Object.values(this.state.isValid).every(Boolean)
}
>
Submit
</Button>
</Form>
)
}
}
render (
<App />,
rootNode
)
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css" /><script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui-react/0.88.2/semantic-ui-react.min.js"></script><div id="root"></div>