Задать вопрос
@zlodiak

Как валидировать поле типа select?

Я создал форму при помощи react-forms и пытаюсь валидировать её поля. С полями типа input и textarea проблем нет, но не получается валидировать поле типа select. Помогите пожалуйста сделать это.

Конкретно проблема в том, что если пользователь заполняет все поля кроме select, то форма всё равно отправляется, что видно по отработавшей функции onSubmit.

Вот правила валидации:
export const required = value => value ? undefined : 'Required';

export const maxLength = max => value =>
  value && value.length > max ? `Must be ${max} characters or less` : undefined;

export const maxLength15 = maxLength(15);


Вот код компонента:
import React from 'react';
import { Field, reduxForm, reset } from 'redux-form';
import store from '../../redux/store';
import { required, maxLength15 } from '../../Validation/index';

const renderField = typeEl => ({ input, label, type, meta: { touched, error, warning } }) => (
  <div>
    <label>{label} -- {typeEl}</label>
    <div>
      { typeEl === 'textarea' && <textarea {...input} placeholder={label} type={type}></textarea> }
      { typeEl === 'input' && <input {...input} placeholder={label} type={type}/> }
      { typeEl === 'select' && <select {...input}><option></option><option value="Male">Male</option><option value="Female">Female</option></select> }
      
      {touched && ((error && <span>{error}</span>) || (warning && <span>{warning}</span>))}
    </div>
  </div>
)

function MessageForm(props) {
  const { handleSubmit, reset, submitting } = props;
  return (
    <form onSubmit={ handleSubmit }>
      <Field 
        name="name" 
        component={ renderField('input') } 
        type="text" 
        label="name"
        validate={[ required, maxLength15 ]}
      />
      <br/>
      <Field 
        name="subject" 
        component={ renderField('input') } 
        type="text" 
        label="subject"
        validate={[ required, maxLength15 ]}
      />
      <br/>
      <Field 
        name="gender" 
        component={ renderField('select') } 
        label="gender"
      />
      <br/>
      <Field 
        name="text" 
        component={ renderField('textarea') } 
        placeholder="text" 
        validate={[ required ]}
      />
      <br/>
      <button type="submit" disabled={ submitting }>Submit</button>
    </form>
  );
}

const MessageReduxForm = reduxForm({
  form: 'message',
})(MessageForm)

function MessageReduxFormWrap() {
  function onSubmit(formData) {
    store.dispatch(reset('message')); 
    console.log('submitted', formData);
  }

  return <MessageReduxForm onSubmit={ onSubmit }/>
}

export default MessageReduxFormWrap;
  • Вопрос задан
  • 299 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы