2016-03-14 8 views
4

Привет, я нашел ответ на это для одной формы поля ... но что, если у нас есть форма с несколькими полями?Как отключить кнопку отправки формы, пока все поля ввода не будут заполнены ?! ReactJS ES2015

это нормально для отключения, если у вас есть 1 поле, но он не работает, если вы хотите, чтобы отключить его на основе многих областях:

getInitialState() { 
    return {email: ''} 
    }, 
    handleChange(e) { 
    this.setState({email: e.target.value}) 
    }, 
    render() { 
    return <div> 
     <input name="email" value={this.state.email} onChange={this.handleChange}/> 
     <button type="button" disabled={!this.state.email}>Button</button> 
    </div> 
    } 
}) 
+0

Я не знаю Реагировать, но я предполагаю, что вы могли бы добавить 'isSubmitAllowed' в состоянии объекта и ссылки, что внутри кнопки в' отключена 'свойство. И тогда 'isSubmitAllowed' будет реализовывать любую логику, необходимую для проверки завершения формы. – nnnnnn

+0

Полностью зависит от конкретной формы. Ничто не мешает вам иметь флаг для каждой кнопки. –

+0

IMO - самый простой и надежный способ сделать это, вычисляет его внутри метода рендеринга. Для ясности вы можете рассчитать, например. 'const canSubmit = ...' в отдельной строке перед оператором 'return' и установить' disabled = {! canSubmit} 'в качестве опоры для кнопки. – ArneHugo

ответ

1

Вот основные настройки для проверки формы:

getInitialState() { 
    return { 
     email: '', 
     text: '', 
     emailValid: false,   // valid flags for each field 
     textValid: false, 
     submitDisabled: true  // separate flag for submit 
    } 
    }, 
    handleChangeEmail(e) {   // separate handler for each field 
    let emailValid = e.target.value ? true : false;  // basic email validation 
    let submitValid = this.state.textValid && emailvalid // validate total form 
    this.setState({ 
     email: e.target.value 
     emailValid: emailValid, 
     submitDisabled: !submitValid 
    }) 
    }, 
    handleChangeText(e) {   // separate handler for each field 
    let textValid = e.target.value ? true : false;  // basic text validation 
    let submitValid = this.state.emailValid && textvalid // validate total form 
    this.setState({ 
     text: '', 
     textValid: textValid, 
     submitDisabled: !submitValid 
    }) 
    }, 
    render() { 
    return <div> 
     <input name="email" value={this.state.email} onChange={this.handleChangeEmail}/> 
     <input name="text" value={this.state.text} onChange={this.handleChangeText}/> 
     <button type="button" disabled={this.state.submitDisabled}>Button</button> 
    </div> 
    } 
}) 

В более сложной настройке вы можете поместить каждое поле ввода в отдельный компонент. И сделайте код более DRY (обратите внимание на дублирование в обработчиках изменений).
Существуют также различные решения для реакционных форм, например here.

5

Я бы немного по-другому, как здесь ...

Вместо установки submitDisabled в каждом onChange обработчика я бы зацепить в методе жизненного цикла, чтобы прослушать изменения.
Точнее, в componentWillUpdate(nextProps, nextState). Этот метод вызывается перед каждым изменением компонента - изменение реквизита или изменение состояния. Здесь вы можете проверить свои данные формы и установить необходимый флажок - все в одном месте. Пример
Кода:

componentWillUpdate(nextProps, nextState) { 
    nextState.invalidData = !(nextState.email && nextState.password); 
}, 

Полных рабочей скрипка https://jsfiddle.net/4emdsb28/

+0

Хорошая настройка! вы, вероятно, также имеете в виду 'componentWillUpdate()' в описании. ('componentWillMount()' не принимает никаких аргументов), и вам, вероятно, понадобится другое событие жизненного цикла для инициализации. – wintvelt

+0

@wintvelt вы правы ... Мой плохой :) – Andreyco

Смежные вопросы