Как включить поле textarea при определении модели формы «Свяжитесь с нами» в реагирующем веб-приложении

Я пытаюсь описать модель формы обратной связи. Эта форма будет иметь два текстовых поля и одно поле 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?

Arnaud Christ 19.06.2019 09:03

Просто добавил компонент DynamicForm выше

Hamid 19.06.2019 10:14

Привет @ArnaudChrist, пожалуйста, дайте мне знать, если вы хотите, чтобы я предоставил любую другую информацию.

Hamid 19.06.2019 10:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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, чтобы я мог сохранить существующие текстовые поля имени и электронной почты вместе с отображением текстовая область для части сообщения.

Hamid 19.06.2019 10:42

Я учусь, буду очень признателен за вашу помощь, если вы сможете направить меня в правильном направлении, пожалуйста.

Hamid 19.06.2019 10:44

Вы должны поставить условие, чтобы знать, какой элемент (из input или textarea) вы должны отобразить. Я обновил свой ответ соответственно.

Arnaud Christ 19.06.2019 10:48

Отлично, что сработало. Спасибо. Похоже, я ударился о другую стену перед собой, поскольку из-за круговой структуры JSON TypeError появилась следующая ошибка: Преобразование круговой структуры в JSON --> начиная с объекта с конструктором 'HTMLInputElement' | свойство '__reactInternalInstance$ce62b1v9p0n' -> объект с конструктором 'FiberNode' --- свойство 'stateNode' замыкает круг

Hamid 19.06.2019 11:19

Это из-за следующего кода <pre style = {{width:"300px"}}> {JSON.stringify(this.state.data)} </pre>

Hamid 19.06.2019 11:21

Поскольку это не связано с вашим первоначальным вопросом, я предлагаю вам создать новый, если вы заблокированы. Это может помочь другим пользователям с такой же проблемой получить ее в будущем.

Arnaud Christ 19.06.2019 11:28

Вот соответствующий вопрос stackoverflow.com/questions/56665437/…

Hamid 19.06.2019 12:49

Другие вопросы по теме