@PHPjedi

Почему возникает ошибка?

Добрый вечер.

Помогите пожалуйста решить проблему.

Проблема что-то связанное с input`ами.

Вот код:

import React, { Component } from 'react';
import '../styles/Register.css';
import { connect } from 'react-redux';
import { withRouter } from 'react-router-dom';
import { registerUser } from '../redux/actions/authActions';

class Register extends Component {
    constructor() {
        super();

        this.state = { name: {inputValue: '', fieldActive: false}, email: '', password: '', password_confirmation: '', errors: {} };

        this.handleSubmit = this.handleSubmit.bind(this);
        this.updateInputValue = this.updateInputValue.bind(this);
        this.activateField = this.activateField.bind(this);
        this.disableFocus = this.disableFocus.bind(this);
    }

    handleSubmit(e) {
        e.preventDefault();
        const data = {
            name: this.state.name,
            email: this.state.email,
            password: this.state.password,
            password_confirmation: this.state.password_confirmation,
        }

        this.props.registerUser(data, this.props.history)
    }

    activateField(e) {
        console.log('hello', e.target.id);
        this.setState({
            [e.target.id]: { fieldActive: true },
        });
    }

    disableFocus(e) {
        console.log('bye bye', e.target.id);
        if (e.target.value === "") {
            this.setState({
                [e.target.id]: { fieldActive: false },
            });
        }
    }

    updateInputValue(e) {
        this.setState({
            [e.target.id]: { inputValue: e.target.value },
        });

        this.activateField(e);
        e.preventDefault();
    }



    componentWillMount() {
        if (this.props.auth.isAuthenticated) {
            this.props.history.push('/')
        }
    }

    componentWillReceiveProps(nextProps, nextContext) {
        if (nextProps.auth.isAuthenticated) {
            this.props.history.push('/')
        }

        if (nextProps.errors) {
            this.setState({ errors: nextProps.errors })
        }
    }

    render() {
        return (
            <div className="container">
                <div className="row justify-content-center">
                    <div className="col-md-6">
                        <form onSubmit={this.handleSubmit}>
                            <div className="floating">
                                <label style={{zIndex: '-1'}} className={this.state.name.fieldActive ? "floating-label field-active" : "floating-label"}>Name</label>
                                <input type="text"
                                       className="floating-label-input"
                                       id="name"
                                       value={this.state.name.inputValue}
                                       onFocus={this.activateField}
                                       onBlur={this.disableFocus}
                                       onChange={this.updateInputValue}
                                />
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        );
    }
}

const mapStateToProps = (state) => ({
    auth: state.auth,
    errors: state.errors,
})

export default connect(mapStateToProps, { registerUser })(withRouter(Register));


Ошибка:

5c730d66680f8089194195.png

Все вроде работает, но почему-то ошибка...

Работает все это так:
5c730d8118548844337540.png5c730d86f0b00155509832.png

Заранее спасибо!
  • Вопрос задан
  • 131 просмотр
Пригласить эксперта
Ответы на вопрос 3
@karambafe
А вы уверены, что вот тут стейт корректно обновляется?
this.setState({
  [e.target.id]: { inputValue: e.target.value },
});


Попробуйте использовать prevState и spread для явной перезаписи:
updateInputValue({ target: { id, value } }) {
  this.setState(prevState => ({ 
     [id]: {
        ...prevState.id,
        inputValue: value,
     },
  }));
}
Ответ написан
@nluparev
PHPjedi ошибка где происходит устнавка и выборка из стейта.

this.setState({
            [e.target.name]: e.target.value
        });

и выборка из стейта

value={this.state.name}
Ответ написан
Комментировать
@Sensetive
Front-End developer
<input type="text"
                                       className="floating-label-input"
                                       id="name"
                                       value={this.state.name.inputValue || ''}
                                       onFocus={this.activateField}
                                       onBlur={this.disableFocus}
                                       onChange={this.updateInputValue}


Из-за того, что изначальное значение inputValue undefined, а затем оно меняется на какое-то при вводе данных возникает такая ошибка. Если отсутствует атрибут value, реакт считает input неконтролируемый.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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