#reactjs
Вопрос:
Я хотел бы получить значения некоторых входных данных при изменении, когда они находятся внутри функции цикла карты. Это мой компонент:
import React, { Component } from "react";
class ArrayComponent extends Component {
constructor(props) {
super(props);
this.state = { objects: [] };
}
handleChange(index, id, e) {
// what to put here ?
// want to have a state like :
// [{index: e.target.value, key: id}, {index: e.target.value, key: id}, ...]
}
render() {
return (
<Form onSubmit={this.onSubmit}>
{items.map((item, index) => (
<div>
{item.name}
<input
key={index}
value={this.state.objects[index]}
onChange={this.handleChange.bind(this, index, item.id)}
/>
</div>
))}
<Button>
Update
</Button>
</Form>
);
}
}
export default ArrayComponent;
Я хочу, чтобы у меня было такое состояние, как :
[{index: e.target.value, id: id}, {index: e.target.value, id: id}, ...]
Это означает, что если это четыре входа, я хочу иметь состояние, подобное приведенному выше, для четырех входов.
Комментарии:
1. откуда берутся «предметы»? я не вижу в этом опоры или чего-либо еще в коде.
2. это происходит от реквизита. Это должно быть
this.props.items.map ...
Ответ №1:
Вы ищете что-то подобное:
constructor(props) {
super(props);
this.state = { objects: {} };
}
handleChange(event, index, id) {
this.setState((state) => {
const newObject = {...state.objects};
newObject[`${index}`] = {value: event.target.value, key: id}
return {objects: newObject }
});
}
render() {
return (
<Form onSubmit={this.onSubmit}>
{items.map((item, index) => (
<div>
{item.name}
<input
key={item.id}
value={this.state.objects[`${index}`]?.value || ''}
onChange={(event) => this.handleChange(event, index, item.id)}
/>
</div>
))}
<Button>
Update
</Button>
</Form>
);
}
}
Вам следует избегать установки index
значений карты в качестве ключей компонентов. Поэтому я удалил индекс и просто использовал идентификатор элемента в качестве ключевой опоры.
Изменить — Удаленный индекс
Вы можете удалить индекс все вместе:
handleChange(event, id) {
this.setState((state) => {
const newObject = {...state.objects};
newObject[`${id}`] = {value: event.target.value, key: id}
return {objects: newObject }
});
}
//........
value={this.state.objects[`${item.id}`]?.value || ''}
onChange={(event) => this.handleChange(event, item.id)}
Комментарии:
1. Я получаю ошибку типа :
this.state.objects["".concat(...)] is undefined
. Я думаю, что этоvalue
вход.2. попробуйте этот
value={this.state.objects[
${индекс}]?.value || ''}
@Tjax3. Спасибо за ваш ответ, он работает,
id
но не работает сindex
почему? Я все равно принимаю твой ответ.4. если вы определили индекс в объявлении функции и получили это значение
${index}
, я действительно не понимаю, почему это не должно работать.Console.log(index)
в томhandleChange
, чтобы увидеть, какую ценность вы получаете.5. Я получаю
object
вместоnumber
того, когда яindex
туда кладу?