Я пытаюсь описать модель формы обратной связи. Эта форма будет иметь два текстовых поля и одно поле textarea, которое будет использоваться для сообщения. Я определил поле сообщения как тип: «текстовое поле», но когда оно отображается, оно отображается как обычное текстовое поле. Может ли кто-нибудь предложить, как определить поле textarea здесь?
Это для простой формы обратной связи в reactjs.
<DynamicForm className = "contactform"
title = "Contact us"
model = {[
{key: "name", label: "Name", props: {required:true}},
{key: "email", label: "E-mail", type:"email"},
{key: "message", label: "Message", type: "textarea" }
]}
onSubmit = {(model) => {this.onSubmit(model)}}
/>
Я ожидаю, что текстовое поле будет отображаться, когда я укажу тип как текстовое поле в приведенном выше коде.
Динамическая форма определяется здесь:
'''
import React from 'react';
import './contact.css';
export default class DynamicForm extends React.Component {
state = {
}
constructor(props) {
super(props);
}
onSubmit = (e) => {
e.preventDefault();
if (this.props.onSubmit) this.props.onSubmit(this.state);
}
onChange = (e, key) => {
this.setState({
[key]: this[key]
})
}
renderForm = () => {
let model = this.props.model;
let formUI = model.map((m) => {
let key = m.key;
let type = m.type || "text";
let props = m.props || {};
return (
<div key = {key} className = "form-group">
<label className = "formlabel"
key = {"l" + m.key}
htmlFor = {m.key}>
{m.label}
</label>
<input {...props}
ref = {(key) => { this[m.key] = key }}
className = "form-input"
type = {type}
key = {"i" + m.key}
onChange = {(e) => { this.onChange(e, key) }}
>
</input>
</div>
)
});
return formUI;
}
render() {
let title = this.props.title || "Dynamic Contact Us Form";
return (
<div className = {this.props.className}>
<h3>{title}</h3>
<form className = "dynamic-form" onSubmit = {(e) => this.onSubmit(e)}>
<div className = "form-group">
{this.renderForm()}
<button type = "submit">Submit</button>
</div>
</form>
</div>
)
}
}
'''
Просто добавил компонент DynamicForm выше
Привет @ArnaudChrist, пожалуйста, дайте мне знать, если вы хотите, чтобы я предоставил любую другую информацию.





textarea — это недопустимый тип типа input.
Вместо этого вы должны использовать textarea HTML-элемент.
Вот что может сработать:
renderForm = () => {
let model = this.props.model;
let formUI = model.map((m) => {
let key = m.key;
let type = m.type || "text";
let props = m.props || {};
return (
<div key = {key} className = "form-group">
<label className = "formlabel"
key = {"l" + m.key}
htmlFor = {m.key}>
{m.label}
</label>
{type === "textarea" ?
(<textarea [Add here the textarea props]>)
:
(<input {...props}
ref = {(key) => { this[m.key] = key }}
className = "form-input"
type = {type}
key = {"i" + m.key}
onChange = {(e) => { this.onChange(e, key) }}
>)}
</input>
</div>
)
});
return formUI;
}
Если я добавлю элемент textarea в приведенном выше операторе возврата в поле ввода, он отобразит текстовую область 3 раза, где я должен добавить элемент html textarea, чтобы я мог сохранить существующие текстовые поля имени и электронной почты вместе с отображением текстовая область для части сообщения.
Я учусь, буду очень признателен за вашу помощь, если вы сможете направить меня в правильном направлении, пожалуйста.
Вы должны поставить условие, чтобы знать, какой элемент (из input или textarea) вы должны отобразить. Я обновил свой ответ соответственно.
Отлично, что сработало. Спасибо. Похоже, я ударился о другую стену перед собой, поскольку из-за круговой структуры JSON TypeError появилась следующая ошибка: Преобразование круговой структуры в JSON --> начиная с объекта с конструктором 'HTMLInputElement' | свойство '__reactInternalInstance$ce62b1v9p0n' -> объект с конструктором 'FiberNode' --- свойство 'stateNode' замыкает круг
Это из-за следующего кода <pre style = {{width:"300px"}}> {JSON.stringify(this.state.data)} </pre>
Поскольку это не связано с вашим первоначальным вопросом, я предлагаю вам создать новый, если вы заблокированы. Это может помочь другим пользователям с такой же проблемой получить ее в будущем.
Вот соответствующий вопрос stackoverflow.com/questions/56665437/…
Откуда взялся ваш компонент
DynamicForm?