Есть компонент, в стейте которого лежит массив объектов phones, метод handleChangeTel должен записывать данные в стейт, но с ним проблема, не получается правильно сделать запись, так как количество номеров телефонов может увеличиваться динамически (метод createItem добавляет номера). Как минимум один номер должен присутствовать всегда.
state = {
phones: [{ title: "", number: "" }],
createItemIdx: 0,
...this.props.contact,
};
handleChangeTel = (event, index) => {
const { name, value } = event.currentTarget;
console.log(index);
console.log(this.state.phones);
console.log(event.currentTarget);
this.setState((prevState) => ({
phones: [{ ...prevState.phones[index], [name]: value }],
}));
};
createItem = () => {
this.setState(({ createItemIdx }) => ({
createItemIdx: createItemIdx + 1,
}));
};
render() {
const { phones, createItemIdx } = this.state;
return (
<form className={style.form_contact} onSubmit={this.handleSubmit}>
<label>
<div>Телефон</div>
<input
className={style.input_contact}
type="text"
name="title"
value={phones[0].title}
// value={title}
onChange={(event) => {
this.handleChangeTel(event, 0);
}}
placeholder="Мобільний, Домашній ..."
required
/>
<input
className={style.input_contact}
type="number"
name="number"
value={phones[0].number}
// value={number}
onChange={(event) => {
this.handleChangeTel(event, 0);
}}
required
/>
</label>
{[...Array(createItemIdx)].map(() => (
<label>
<div>Телефон </div>
<input
className={style.input_contact}
type="text"
name="title"
// value={phones[1].title}
onChange={(event) => {
this.handleChangeTel(event, 1);
}}
placeholder="Мобільний, Домашній ..."
// required
/>
<input
className={style.input_contact}
type="number"
name="number"
// value={phones[1].number}
onChange={(event) => {
this.handleChangeTel(event, 1);
}}
// required
/>
</label>
))}
<div>
<IconButton onClick={this.createItem}>
<Add width="10" height="10" />
</IconButton>
</div>
<button type="submit">
{this.state.id ? "Редагувати" : "Зберегти"}
</button>
</form>
);
}
}
export default ContactForm;