У меня есть форма в React, которая динамически добавляет новые элементы ввода. Кажется, это работает нормально, но я не могу получить доступ к входным значениям, как показано на этом снимке экрана...
Я пробовал следующее
console.info(это.состояние.телефон.имя)
а также...
console.info(this.state.telephone.tidx.name)
где tidx — уникальный ключ.
Вот конструктор...
constructor() {
super();
this.state = {
role: "Installer",
name: "",
telephoneType: [{ name: "" }],
telephone: [{ name: "" }],
tidx: "",
emailType: [{ email: "" }],
email: [{ email: "" }],
eidx: "",
notes: ""
};
}
и это моя функция для обработки форм ввода...
handleTelephoneChange = tidx => evt => {
const newTelephone = this.state.telephone.map((telephone, tsidx) => {
if (tidx !== tsidx) return telephone;
return { ...telephone, name: evt.target.value };
});
this.setState({ telephone: newTelephone }, () => {
// get state on callback
console.info(this.state)
console.info(this.state.telephone.name)
console.info(this.state.telephone.tidx.name)
}
);
};
а отрисовано вот так...
{this.state.telephone.map((telephone, tidx) => (
<MDBRow key = {tidx} className = "grey-text flex-nowrap align-items-center no-gutters my-2">
<MDBCol md = "12">
<input value = {telephone.name} onChange = {this.handleTelephoneChange(tidx)}placeholder = {`Telephone No. #${tidx + 1}`} className = "form-control"/>
</MDBCol>
</MDBRow>
))}
Любые советы очень ценятся, так как я новичок в формах в React. Спасибо.



telephone — это массив, поэтому вы должны использовать обозначение индекса.
console.info(this.state.telephone[tidx].name)
Чтобы отобразить соответствующий тип телефона для каждого телефона:
{this.state.telephone.map((telephone, tidx) => (
<MDBRow key = {tidx} className = "grey-text flex-nowrap align-items-center no-gutters my-2">
<MDBCol md = "12">
<input value = {this.state.telephoneType[tidx].yourValue} onChange = {this.defineYourTelephoneTypeEventHandler(tidx)}/>
<input value = {telephone.name} onChange = {this.handleTelephoneChange(tidx)}placeholder = {`Telephone No. #${tidx + 1}`} className = "form-control"/>
</MDBCol>
</MDBRow>
))}
@StevenCollins очень рад, что первая часть сработала для вас. Интересно, а у вас не возникло проблем с пользовательским интерфейсом в исходном коде?
все верно, раньше все работало. вот короткое видео с моим оригинальным обработчиком событий screencast.com/t/pQOPVLff
Я надеюсь, вы не возражаете против еще одного быстрого вопроса, связанного с моим постом, который меня беспокоил. У меня есть другое поле ввода под названием TelephoneType. Возможно ли сделать что-то подобное или они должны быть разделены? {this.state.telephone.map((телефон, tidx, phoneType, ttidx) => ()}
@StevenCollins, вы не можете сделать это в своем существующем this.state.telephone.map(), эта функция строго следует этой структуре аргументов. array.map((item, index, ownArray)) поэтому вы не сможете напрямую нацеливаться на другой массив. Однако, если мы предположим, что порядок элементов в telephone arr соответствует тому же порядку элементов в telephoneType, вы можете просто использовать индекс предоставленного первого массива, чтобы получить значение второго массива. Точно так же вы бы использовали обозначение индекса :)... В противном случае вы можете просто использовать второй .map()
Телефон и TelephoneType должны быть возвращены вместе для каждой строки, если это имеет смысл. screencast.com/t/CN3EssEK0p Возможно, мне придется открыть для этого новый пост..
Я пытался использовать отдельный .map(), но это нарушало пользовательский интерфейс. Я попробую еще раз. Спасибо.
См. мое обновленное решение выше, также обратите внимание, что вам также необходимо создать обработчик событий для типа телефона.
да, у меня уже есть это, но так как это выбор/раскрывающийся список, это немного сложнее screencast.com/t/InaZf0CgWs Мне нравится вызов, ха-ха
Наконец-то я заработал с вашим обновленным кодом выше. Спасибо. screencast.com/t/D2KQ8iIDsy
Это большое спасибо, нотация индекса сработала. Я не могу ничего ввести в поле ввода, если воспользуюсь вашим предложением обработчика событий.