Ошибка в компоненте React при рендере

Поскольку я новичок в ReactJS.

Что я делаю, так это когда я печатаю любое поле. Состояние должно быть обновлено в конкретном поле -

Поскольку это мой LoginComponet и настройка небольшой формы -

import React, { Component } from 'react';
import '../css/style.css';


export class LoginCompoent extends Component {

constructor(props) {
    super(props);
    this.state = {
        field: {
            phone: {
                value: '',
                validations: [],
                errors: []
            },
            password: {
                value: '',
                validations: [],
                errors: []
            }
        }
    };
    this.handelChangeEvent = this.handelChangeEvent.bind(this);
}

componentDidMount() {

}

handelChangeEvent(event) {

    this.setState({
        field: {
            [event.target.id]: {
                'value': event.target.value
            }
        }
    });
}

render() {
    console.info(this.state);

    return (
        <div className = "loginMainDiv" >
            <div className = "">
                <input className = "login_inp" placeholder = "Mobile Number"
                    value = {this.state.field.phone.value}
                    onChange = {this.handelChangeEvent}
                    type = "text" name = "phone" id = "phone"
                />
                <input className = "login_inp" placeholder = "Password"
                    value = {this.state.field.password.value}
                    onChange = {this.handelChangeEvent}
                    type = "password" name = "password" id = "password"
                />
                <button className = "login_btn" >Login Safely</button>
            </div>
        </div>
    );
}

}

Ожидаемый результат - на console.info(this.state);

когда я набираю 9 в поле телефона -

      field: {
            phone: {
                value: '9',
                validations: [],
                errors: []
            },
            password: {
                value: '',
                validations: [],
                errors: []
            }
        }

Получение результата -

field: {
            phone: {
                value: '9'
            }
        }

Я не знаю, почему все поля внезапно скрываются, когда я обновляю только поле телефона. ?

Из-за этого пароль не задается в форме. ОШИБКА - this.state.field.password - это undefined ???

Ваш обработчик кликов выходит за рамки. встроенный onClick в reactjs ничем не отличается от addEventListener

Andrew 24.04.2018 08:44
«Я не знаю, почему все поля внезапно скрываются, когда я обновляю только поле телефона». Реагирует не на глубокое слияние, а только на мелкое. Т.е. field будет иметь именно то значение, которое вы передаете ему в setState. Если вы хотите сохранить существующие свойства field, см. stackoverflow.com/q/40601834/218196, stackoverflow.com/a/36527439/218196 и любой из stackoverflow.com/search?q=%5Breactjs%5D+update+nested+objec‌ т.
Felix Kling 24.04.2018 08:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
99
3

Ответы 3

Проблемы с глубоким слиянием, когда вы устанавливаете свойство name для своего ввода, это должно работать:

this.setState(prevState => ({
  field: {
    ...prevState.field,
    [event.target.name]: {
      'value': event.target.value
    }
  }
}));

Спасибо за ответ. Поскольку вы сказали, что я внес изменения, я получаю ERROR- Uncaught TypeError: Cannot read property 'id' of null на this.setState( prevState => ( {} ) )?

hardy 24.04.2018 09:40

Редактирую свой ответ. Используйте свойство name вашего ввода вместо id.

Striped 24.04.2018 09:54

Ваш ответ был полезен Я проголосовал за :) Спасибо, но эта ошибка была удалена этой упомянутой статьей в моем ответе, пожалуйста, обратитесь к этому - stackoverflow.com/questions/49994964/…

hardy 25.04.2018 10:24

В вашей функции handleChangeEventEvent вы обновляете значение field в состоянии:

this.setState({field: {
    [event.target.id]: {
        'value': event.target.value
    }
}})

Это, очевидно, перезапишет существующее значение field.

В вашем случае я бы рекомендовал использовать функцию обратного вызова внутри setState. См. документы.

Например, если вы хотите обновить значение phone, но при этом хотите, чтобы значение пароля оставалось неизменным, вы можете сделать что-то вроде этого:

handleChangeEventEvent = (event) => {
    this.setState((prevState) => {
      return {field: {
                [event.target.id]: event.target.value,
                ...prevState.field
            }
        };
    });
}

Спасибо за ответ, подскажите, пожалуйста, что будет делать ...prevState.field? в установленном состоянии

hardy 24.04.2018 11:34

На самом деле это деструктурирующий оператор присваивания. Об этом можно прочитать здесь: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Shishir Anshuman 24.04.2018 11:37

Поскольку я пробовал все вышеперечисленные ответы, но столкнулся с ошибкой.

ERROR- Uncaught TypeError: Cannot read property 'id' of null on this.setState( prevState => ( {} ) ).

Проблема заключалась в том, что ссылка на событие не поддерживается в асинхронном вызове, поэтому event.target становится null и выходит за рамки ошибки.

Я получил концепцию event.persist(), которая помогает поддерживать все ссылки на событие и превращать Wrapper в событие браузера с асинхронными вызовами.

Вы можете перейти к этой ссылке Статья

Другие вопросы по теме