Поскольку я новичок в 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 ???
field будет иметь именно то значение, которое вы передаете ему в setState. Если вы хотите сохранить существующие свойства field, см. stackoverflow.com/q/40601834/218196, stackoverflow.com/a/36527439/218196 и любой из stackoverflow.com/search?q=%5Breactjs%5D+update+nested+objec т.





Проблемы с глубоким слиянием, когда вы устанавливаете свойство 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 => ( {} ) )?
Редактирую свой ответ. Используйте свойство name вашего ввода вместо id.
Ваш ответ был полезен Я проголосовал за :) Спасибо, но эта ошибка была удалена этой упомянутой статьей в моем ответе, пожалуйста, обратитесь к этому - stackoverflow.com/questions/49994964/…
В вашей функции 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? в установленном состоянии
На самом деле это деструктурирующий оператор присваивания. Об этом можно прочитать здесь: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Поскольку я пробовал все вышеперечисленные ответы, но столкнулся с ошибкой.
ERROR- Uncaught TypeError: Cannot read property 'id' of null on this.setState( prevState => ( {} ) ).
Проблема заключалась в том, что ссылка на событие не поддерживается в асинхронном вызове, поэтому event.target становится null и выходит за рамки ошибки.
Я получил концепцию event.persist(), которая помогает поддерживать все ссылки на событие и превращать Wrapper в событие браузера с асинхронными вызовами.
Вы можете перейти к этой ссылке Статья
Ваш обработчик кликов выходит за рамки. встроенный
onClickв reactjs ничем не отличается отaddEventListener