React.Js — FormControl не обновляет мое значение

В настоящее время я работаю над стороной входа в свое приложение для реагирования, и у меня возникла проблема с обновлением данных моего состояния из ввода.

У меня есть этот компонент:

import React from 'react'
import { login } from '../../api/Authentication'
import { setStore } from '../../webapp/storage'
import { Button, ControlLabel, Form, FormControl, FormGroup } from 'react-bootstrap';


export default class LoginPage extends React.Component {

    constructor(props){
        super(props);
        this.state={
            email:'',
            password:''
        }
    }

    handleSubmit(event) {

        if (this.state.email == '' || this.state.password == '') {
            if (this.state.email == '') {
                this.badInfosAlert('Email field empty')
            } else if (this.state.password == '') {
                this.badInfosAlert('Password field empty')
            }
            return
        }

        console.log('-----------------------')
        console.log(this.state.email)
        console.log(this.state.password)
        var user = {
            email: this.state.email,
            password: this.state.password
        }
        console.log(JSON.stringify(user))
        console.log('-----------------------')

        login(user).then(result => {
            if (result != null && result.status == 200) {
                setStore('token', result.json.user.token)
            } else {
                this.badInfosAlert(result.json.error)
            }
        }).catch(this.badInfosAlert('An error happend'));
    }

    badInfosAlert(message) {
        console.log(message);
        alert(message);
    }

    render() {
        return (
            <div className='col-lg-12'>
                <Form>
                    <FormGroup controlId="formHorizontalEmail">
                        <ControlLabel>Email </ControlLabel>
                        <FormControl type="username" onChange = {(event,newValue) => this.setState({email:newValue})} placeholder="Email" />
                    </FormGroup>
                    <FormGroup controlId="formHorizontalPassword">
                        <ControlLabel>Password </ControlLabel>
                        <FormControl type="password" onChange = {(event,newValue) => this.setState({password:newValue})} placeholder="Password" />
                    </FormGroup>
                    <Button onClick={(event) => this.handleSubmit(event)}>Login</Button>
                </Form>
            </div>
        )
    }
}

Дело в том, что каждый раз, когда я нажимаю кнопку «Отправить», мой адрес электронной почты/пароль в состоянии равен нулю, даже если поля заполнены, почему так?

Я все еще супер новичок в JavaScript (а не просто реагирую), поэтому, пожалуйста, объясните свой ответ как можно подробнее :)

Спасибо !


person Emixam23    schedule 26.01.2018    source источник


Ответы (2)


Как вы можете видеть в документации к формам react-bootstrap, вы получите newValue из вашего объекта события, переданного вашей функции. Итак, ваш код должен выглядеть так:

<FormControl type="username" onChange = {(event) => this.setState({email: event.target.value })} placeholder="Email" />

и сделайте то же самое с другим входом, и все должно работать нормально. Насколько я знаю, FormControls из react-bootstrap не даст вам второй параметр «newValue».

person Sebastian K.    schedule 26.01.2018
comment
Спасибо, ты был прав! Я неправильно понял и попробовал решение, которое я видел на StackOverflow, где люди говорили, что оно работает. Думаю, я пропустил слияние обоих ... Спасибо! - person Emixam23; 26.01.2018
comment
В общем, все теги ввода html возвращают объект события, откуда вы можете взять значение. Но в некоторых пользовательских компонентах реакции они фактически дают значение в качестве второго параметра, что, на мой взгляд, не очень интуитивно понятно. - person Sebastian K.; 26.01.2018

Используйте это так

 <FormControl type="username" onChange = {(event) => this.setState({email:event.target.value})} placeholder="Email" />

Теперь это должно работать. В основном значение, прикрепленное к полю ввода, доступно в event.target.value.

person simbathesailor    schedule 26.01.2018